📄 lcd_test.c
字号:
/********************************************************
功能描述: LC75823E芯片测试程序
说明:本测试程序能够测试LC75823E的每一个字段,依次点亮每一个字段
********************************************************/
#include " REGX51.h "
#include " intrins.h "
#include <stdio.h>
#include <absacc.h>
sbit LCD_SCL = P3^5; //LC75823E的SCLk引脚
sbit LCD_SDA = P3^1; //LC75823E的SDA引脚
sbit LCD_CE = P3^3; //LC75823E的sce引脚
//按键定义
sbit keya=P2^1;
sbit keyb=P2^0;
#define uchar unsigned char
#define uint unsigned int
#define LCD_BUFFER_SIZE 20//20*8 = 160
#define LC75823E_ADDRESS 0x41
#define DR_1_2_BIAS 0
#define DR_1_3_BIAS 1
#define SC_ON 0
#define SC_OFF 1
#define BU_NORMAL 0
#define BU_POWER_SAVING 1
unsigned char a,b;//a(20)表示LC75823E的内存区中的byte数;
//b(10)表示对应的byte中的数据段,设置了10个数,
//0表示不显示,9表示全部显示,1~8表示byte对应的段
unsigned char display_flag;//更改显示标志
unsigned char LEDScanPointer;
unsigned char displaya,displayb,displayc,displayd;
unsigned char code LEDCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字0~9共阳数码管代码
unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管位选代码
uchar LC75823E_buff[20];//LC75823E的内存数据区,共20个byte
/********************************************************
函数名称:延时函数
功能描述:
全局变量:
参数说明:
返回说明:
说明:
********************************************************/
void delay_nms(unsigned int n)
{
unsigned int i;
unsigned char j;
for(i=0;i<n;i++)
for(j=0;j<120;j++)
; //空操作
}
/********************************************************
函数名称:LC75823_Write_Buffer()
功能描述:向LC75823E一次性发送地址码、显示位、控制码
全局变量:
参数说明:
返回说明:
说明:地址码共8bit、显示位与控制码一共20byte
********************************************************/
void LC75823_Write_Buffer() reentrant
{
uint temp;
uchar i,j,ccb_address = LC75823E_ADDRESS;
//发送地址码0x41//
LCD_CE = 0;
for (i=0;i<8;i++)
{
LCD_SCL=0;
if(ccb_address&0x01)
LCD_SDA = 1;
else
LCD_SDA = 0;
ccb_address>>=1;
LCD_SCL=1;
}
LCD_CE = 1;
//发送显示位与控制位//
for (j=0;j<LCD_BUFFER_SIZE;j++)
{
temp = LC75823E_buff[j];
if (j == LCD_BUFFER_SIZE-1)
{
temp|=0x80;//最后最后一个byte的高4位为控制位:DR,SC,BU,*
} //0001:DR(0)1/2偏压;SC(0)segment on;BU(0)Normal mode;* 1
for(i=0;i<8;i++)
{
LCD_SCL=0;
if(temp&0x01)
LCD_SDA = 1;
else
LCD_SDA = 0;
temp>>=1;
LCD_SCL=1;
}
}
LCD_CE=0;
LCD_SDA=1;
LCD_SCL=1;
}
/********************************************************
函数名称:LCD_init()
功能描述: LC75823E初始化
全局变量:
参数说明:
返回说明:
说明:
********************************************************/
void LCD_init()
{
delay_nms(100);
LCD_CE = 1;
delay_nms(20);
LCD_CE=0;
delay_nms(10);
LCD_SCL=0;
LCD_SDA=0;
}
/********************************************************
函数名称:main()
功能描述: LC75823E测试主函数
全局变量:
参数说明:
返回说明:
说明:可以测试出LC75823E显示屏的156个点的位置
********************************************************/
void main()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
a=0;
b=0;
display_flag=0;
LCD_init();
LC75823_Write_Buffer();
while(1)
{ if(keya==0)
{
delay_nms(200);
if(keya==0)
{
a++;
if(a==20) { a=0; }//按键A用于记数内存区 byte个数
display_flag=1;
while(keya==0);
}
}
if(keyb==0)
{
delay_nms(200);
if(keyb==0)
{
b++;
if(b==10) { b=0; } //按键B用于记数每个byte中对应的显示位,
//设置10个数,0表示不显示;9表示全部显示
//1~8表示对应的8个显示位
display_flag=1;
while(keyb==0);
}
}
//LED显示当前按键的按下次数//
displaya=a/10;
displayb=a%10;
displayc=b/10;
displayd=b%10;
}
}
/********************************************************
函数名称:
功能描述:
全局变量:
参数说明:
返回说明:
说明:
********************************************************/
void timer0(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
switch(LEDScanPointer)
{
case 0:
P0=LEDCode[displaya];
P1=bitcode[3];
break;
case 1:
P0=LEDCode[displayb];
P1=bitcode[2];
break;
case 2:
P0=LEDCode[displayc];
P1=bitcode[1];
break;
case 3:
P0=LEDCode[displayd];
P1=bitcode[0];
break;
}
LEDScanPointer++;
if(LEDScanPointer==4) LEDScanPointer=0;
if(display_flag==1)
{
unsigned char dataT;
uint temp;
temp = a;
switch(b)
{
//不显示数据标志//
case 0 : dataT=0x00; break;
//显示低4bit对应的数据段//
case 1 : dataT=0x01; break;
case 2 : dataT=0x02; break;
case 3 : dataT=0x04; break;
case 4 : dataT=0x08; break;
//显示高4bit对应的数据段//
case 5 : dataT=0x10; break;
case 6 : dataT=0x20; break;
case 7 : dataT=0x40; break;
case 8 : dataT=0x80; break;
//全部显示//
case 9 : dataT=0xff; break;
}
LC75823E_buff[temp]|=dataT;//向LC75823E内存区送数
LC75823_Write_Buffer();//向LC75823E写数据
display_flag=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -