📄 key_display.c
字号:
//******************Includes*******************
#include <stdio.h>
#include <reg669.h>
#include <intrins.h>
//***************8/16-bit SFR*********************
sbit DI = P1^5; //只指令数据通道
sbit RW = P1^4; // 读写选择,R/W=1为读选通;R/W=0为写选通
sbit CSB = P1^6; //片选2
sbit CSA = P1^7; //片选1
sbit E1 = P3^7; //E是使能信号,数据在下降沿时被写入LCM,在高电平时被读出LCM
sbit E2 = P3^6;
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P3_2 = P3^2;
//***********Define the register command code****************
#define Disp_On 0x3F // 即P0=DB=3F,也就是DB0=1时,LCD显示RAM中的内容
#define Disp_Off 0x3E // 即DB0=0时,关闭显示
#define Col_Add 0x40 // 列地址(Y Address) 设置指令,起始列(0列)指令,共64页(0到63列)
#define Page_Add 0xB8 // 页PAGE设置指令,起始页(0页)指令,共8页(0到7页)
#define Start_Line 0xC0 // 显示起始行ROW设置指令,起始行(0列)指令,共64行(0到63行)
#define Fosc 11059200 //单片机外部时钟
//***************Function PROTOTYPES**********************
void delay(unsigned char);
void delay_10us(unsigned char);
void initial_LCD(void);
void clear_LCD (void);
void get_str(void);
void key_fun (void);
void send_com(unsigned char);
void send_data(unsigned char );
void hz_disp16(unsigned char,unsigned char,unsigned char code *);
void sz_disp8(unsigned char,unsigned char,unsigned char code *);
void sz_disp8_input(unsigned char,unsigned char, unsigned char code *);
void DISPLAY (void);
void DISPLAY_shijian (void);
bit kb_hit (void);
unsigned char get_ch (void);
void DISPLAY_input(void);
void clear_LCD_input(void);
//****************Global VARIABLES************************
char data poc=0; //用于键值计算的参数
struct TIME{
char min;
char sec;
};
struct TIME xdata time_z ={0,0};
struct TIME xdata time_j ={0,0};
struct TIME xdata time1 ={0,0};
struct TIME xdata time2 ={0,0};
struct TIME xdata time_c ={0,0};
struct TIME xdata time_in ={0,0};
struct TIME xdata zhaoshe ={0,0};
struct TIME xdata jiange ={0,0};
struct TIME xdata measure_T ={0,0};
struct TIME xdata finish_T ={0,0};
/* LCD显示的二进制代码 */
// 照
char code zhao[]={
0x00,0x00,0xFE,0x22,0x22,0xFE,0x40,0x21,0xD1,0x4F,0x41,0x41,0x61,0xDF,0x00,0x00,
0x40,0x60,0x3B,0x01,0x09,0x33,0x60,0x00,0x0F,0x32,0x62,0x04,0x0A,0x37,0x60,0x00};
// 射
char code she[]={
0x00,0x00,0xFC,0x56,0x55,0x54,0x54,0xFC,0x10,0x90,0x10,0x10,0xFF,0x10,0x10,0x00,
0x00,0x42,0x23,0x12,0x0A,0x46,0x82,0x7F,0x00,0x00,0x47,0x80,0x7F,0x00,0x00,0x00};
// 冒号
char code maohao[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
// 测
char code ce[]={
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xF7,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x67,0x10,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00};
// 量
char code liang[]={
0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0x5D,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x40,0x40,0x40,0x00};
// 样
char code yang[]={
0x08,0x88,0x68,0xFF,0x48,0x88,0x00,0x49,0x4E,0x48,0xF8,0x4C,0x4B,0x48,0x08,0x00,
0x02,0x01,0x00,0xFF,0x00,0x00,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x00};
// 1
char code yi[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x00};
// 2
char code er[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x21,0x21,0x21,0x21,0x00,0x00,0x00,0x00,0x00};
// 分
char code fen[]={
0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,
0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x40,0x80,0xFF,0x00,0x00,0x00,0x00,0x00};
// 秒
char code miao[]={
0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x83,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00};
char code shijian[]={
/* 0 (16*8) */
0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x3F,0x00, //16
/* 1 (16*8) */
0x00,0x00,0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00, //32
/* 2 (16*8) */
0x00,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x3F,0x21,0x21,0x21,0x21,0x21,0x00, //48
/* 3 (16*8) */
0x00,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x21,0x21,0x21,0x21,0x21,0x3F,0x00, //64
/* 4 (16*8) */
0x00,0xF8,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x3F,0x00, //80
/* 5 (16*8) */
0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x21,0x21,0x21,0x21,0x21,0x3F,0x00, //96
/* 6 (16*8) */
0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x3F,0x21,0x21,0x21,0x21,0x3F,0x00, //112
/* 7 (16*8) */
0x00,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00, //128
/* 8 (16*8) */
0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x3F,0x21,0x21,0x21,0x21,0x3F,0x00, //144
/* 9 (16*8) */
0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x21,0x21,0x21,0x21,0x21,0x3F,0x00, //160
/* A (16*8) */
0xC0,0x60,0x30,0x18,0x18,0x30,0x60,0xC0,0x3F,0x02,0x02,0x02,0x02,0x02,0x02,0x3F, //176
/* B (16*8) */
0x00,0xf8,0x08,0x08,0x08,0x08,0xf0,0x00,0x00,0x3f,0x21,0x21,0x21,0x21,0x1e,0x00, //194
/* C (16*8) */
0xe0,0x10,0x08,0x08,0x08,0x08,0x10,0x00,0x0f,0x10,0x20,0x20,0x20,0x20,0x10,0x00, //210
/* D (16*8) */
0x00,0xf8,0x08,0x08,0x08,0x18,0x30,0xe0,0x00,0x3f,0x20,0x20,0x20,0x30,0x18,0x0f, //226
/* E (16*8) */
0x00,0xf8,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x3f,0x21,0x21,0x21,0x21,0x21,0x00, //242
/* F (16*8) */
0x00,0xf8,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x3f,0x01,0x01,0x01,0x01,0x00,0x00};
// ******************MAIN Routine********************
main()
{
delay(50); // 延时,等待系统上电稳定
initial_LCD(); // initialize LCD
clear_LCD();
DISPLAY_input(); // 输入时间显示
while(1)
{
while(!kb_hit());
key_fun();
}
}
//***********延时us*****************************
void delay_10us(unsigned char x)
{
while(x--);
}
//***********延时ms*****************************
void delay(unsigned char cnt)
{
unsigned char i;
do {
i = 4;
do {
delay_10us(39);
} while(--i);
} while(--cnt);
}
//******************判断是否有键按下的函数*******************
bit kb_hit(void)
{
P2 &= 0xF0 ;
if((P2 & 0xF0) == 0xF0)
{
return(0);
}
else
{
delay(50);
if((P2 & 0xF0) == 0xF0)
{
return(0); //无键按下返回0
}
else {return(1);} //有键按下返回1
}
}
//*******************键盘输入函数********************
unsigned char get_ch(void)
{
unsigned char row=0,col=3;
unsigned char pic;
unsigned char mask=0xFE;
if( !kb_hit() )
{
return(0);
}
/* 分析按键所在的列号 */
P2 = mask;
while( (P2 & 0xF0 )==0xF0 && mask>0xEF)
{
--col;
mask = _crol_(mask,1);
P2 = mask;
}
/* 分析按键所在的行号 */
mask=0xEF;
P2=mask;
while( (P2 & 0x0F )==0x0F && mask!=0xFE)
{
++row;
mask = _crol_(mask,1);
P2=mask;
}
/* 等待按键释放 */
while( (P2 & 0xF0 )==0xF0);
P2=0xFF;
/* 计算按键键值并转成ASCII码值返回 */
pic=row+col*4;
CSA=1;CSB=0;
if( pic < 10)
{
poc=pic;
pic += '0';
sz_disp8_input(3,48,&shijian[pic*16]);
}
else
{
sz_disp8_input(3,48,&shijian[pic*16]);
pic += 'A'-10;
}
return(pic);
}
//****************时间输入函数*********************
void get_str(void)
{
unsigned char data i;
for(i=0;i<4;i++) //先后输入四个数字作为一个时间的分和秒(60进制)
{
while(!kb_hit());
get_ch();
time_in.min = (time_in.min%10)*10+time_in.sec/10;
time_in.sec = (time_in.sec%10)*10+poc;
DISPLAY_input(); //输入时间的显示
}
}
//*****************键盘功能键***********************
void key_fun(void)
{
switch(get_ch())
{
case 'A': //进入照射时间的输入,如果出输入有误,重新按A键开始输入
clear_LCD_input();
get_str();
zhaoshe=time_in;
time_z=time_in;
return; //退回该函数的调用处
case 'B': //进入间隔时间的输入
time_in.min =0; //清空前一次的输入
time_in.sec =0;
DISPLAY_input();
get_str();
jiange=time_in;
return;
}
}
//***********清屏*****************************
void clear_LCD(void)
{
unsigned char m,i;
CSA=0;CSB=0;
send_com(Page_Add+0);
send_com(Col_Add+0);
for(i=0;i<8;i++)
{
send_com(Page_Add+i);
for(m=0;m<64;m++)send_data(0x00);
}
}
void clear_LCD_input(void)
{
unsigned char m,i;
CSA=0;CSB=1;
send_com(Page_Add+0);
send_com(Col_Add+0);
for(i=0;i<8;i++)
{
send_com(Page_Add+i);
for(m=0;m<64;m++)send_data(0x00);
}
}
//**********LCD初始化************************
void initial_LCD(void)
{
delay(10);
CSA=0;CSB=0;
send_com(Disp_Off);
send_com(Page_Add+0);
send_com(Start_Line+0);
send_com(Col_Add+0);
send_com(Disp_On);
}
//**********数据写命令***************************
void send_com(unsigned char command )
{
delay_10us(1);
DI=0;
RW=0;
P0=command;
E2 =1;
E1 =0;
delay_10us(1);
E1 =1;
}
//**********写数据***************************
void send_data(unsigned char dat )
{
delay_10us(1);
DI=1;
RW=0;
P0=dat;
E2 =1;
E1 =0;
delay_10us(1);
E1 =1;
delay(10);
}
//*****************指定位置显示汉字16*16****************
void hz_disp16(unsigned char pag,unsigned char col, unsigned char code *hzk)
{
unsigned char m=0,i=0;
for(m=0;m<2;m++)
{
send_com(Page_Add+pag+m);
send_com(Col_Add+col);
for(i=0;i<16;i++)
send_data(hzk[16*m+i]);
}
}
//******************显示静态点阵子程序************
void DISPLAY(void)
{
unsigned char m=0,i=0;
CSA=0;CSB=1;
hz_disp16(0,0,zhao);
delay(1);
hz_disp16(0,16,she);
delay(1);
hz_disp16(0,32,maohao);
delay(1);
hz_disp16(2,0,ce);
delay(1);
hz_disp16(2,16,liang);
delay(1);
hz_disp16(2,32,maohao);
delay(1);
hz_disp16(4,0,yang);
delay(1);
hz_disp16(4,16,yi);
delay(1);
hz_disp16(4,32,maohao);
delay(1);
hz_disp16(6,0,yang);
delay(1);
hz_disp16(6,16,er);
delay(1);
hz_disp16(6,32,maohao);
delay(1);
CSA=1;CSB=0;
for(i=0;i<4;i++)
{
hz_disp16(m,0,fen);
delay(1);
hz_disp16(m,32,miao);
delay(1);
m+=2;
}
}
//****************指定位置显示时间16*8******************
void sz_disp8(unsigned char page,unsigned char coll, unsigned char code *szk)
{
unsigned char m=0,i=0;
for(m=0;m<2;m++)
{
send_com(Page_Add+page+m);
send_com(Col_Add+coll);
for(i=0;i<8;i++)
send_data(szk[8*m+i]);
}
}
//******************显示动态点阵子程序************
void DISPLAY_shijian(void)
{
CSA=0;CSB=1;
sz_disp8(0,48,&shijian[(time_z.min/10)*16]);
delay(1);
sz_disp8(0,56,&shijian[(time_z.min%10)*16]);
delay(1);
sz_disp8(2,48,&shijian[(time_c.min/10)*16]);
delay(1);
sz_disp8(2,56,&shijian[(time_c.min%10)*16]);
delay(1);
sz_disp8(4,48,&shijian[(time1.min/10)*16]);
delay(1);
sz_disp8(4,56,&shijian[(time1.min%10)*16]);
delay(1);
sz_disp8(6,48,&shijian[(time2.min/10)*16]);
delay(1);
sz_disp8(6,56,&shijian[(time2.min%10)*16]);
delay(1);
CSA=1;CSB=0;
sz_disp8(0,16,&shijian[(time_z.sec/10)*16]);
delay(1);
sz_disp8(0,24,&shijian[(time_z.sec%10)*16]);
delay(1);
sz_disp8(2,16,&shijian[(time_c.sec/10)*16]);
delay(1);
sz_disp8(2,24,&shijian[(time_c.sec%10)*16]);
delay(1);
sz_disp8(4,16,&shijian[(time1.sec/10)*16]);
delay(1);
sz_disp8(4,24,&shijian[(time1.sec%10)*16]);
delay(1);
sz_disp8(6,16,&shijian[(time2.sec/10)*16]);
delay(1);
sz_disp8(6,24,&shijian[(time2.sec%10)*16]);
delay(1);
}
//****************指定位置显示时间16*8******************
void sz_disp8_input(unsigned char pag0,unsigned char col0, unsigned char code *sjk)
{
unsigned char m=0,i=0;
for(m=0;m<2;m++)
{
send_com(Page_Add+pag0+m);
send_com(Col_Add+col0);
for(i=0;i<8;i++)
send_data(sjk[8*m+i]);
}
}
//***************输入显示*********************
void DISPLAY_input(void)
{
CSA=0;CSB=1;
sz_disp8_input(3,32,&shijian[(time_in.min/10)*16]);
delay(1);
sz_disp8_input(3,40,&shijian[(time_in.min%10)*16]);
delay(1);
sz_disp8_input(3,48,&shijian[(time_in.sec/10)*16]);
delay(1);
sz_disp8_input(3,56,&shijian[(time_in.sec%10)*16]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -