📄 main.c
字号:
#include<reg52.h>
#include<lcd12864.h>//包含128X64驱动程序
#include<hzzi.H> //包含图片和汉字库
sbit Key_Data =P2^1;//定义Keyboard数据端口引脚
sbit Key_CLK=P3^2; //中断端口,时钟线
static unsigned char KeyV=0X00; //键值
static unsigned char BF = 0; //标识是否有字符被收到
static unsigned char IntNum = 0; //中断次数计数
unsigned char lie,hang;//lie为列值, hang为行值
bit dx=0; //大小写标志 dx==1时大写状态
////*************************\\\\\\\\\\\\\\\\\\\\\\\\\\\
void Keyboard_out(void) interrupt 2//键盘中断处理 键值存储在 KeyV 中
{
if ((IntNum>0) && (IntNum <9))
{
KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
if (Key_Data==1) //当键盘数据线为1时
{KeyV = KeyV | 0x80;} //存储一位
}
IntNum++; //中断次数加一(中断一次接收一位数据)
if (IntNum > 10) //中断11次后数据发送完毕
{
IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
BF = 1; //标识有字符输入完了
EA = 0; //关中断等显示完后再开中
}
}
void Decode() //键值处理
{
unsigned char data TempCyc;
signed char data k;
TempCyc=KeyV;
if(BF==1) //接收完一个有效数据时
{
BF=0; //准备下一次接收
switch ( TempCyc ) //键值与显示字符的对应关系
{ //键值// //对应字符//
case 0x8A: k=0; break; //0
case 0x2C: k=1; break; //1
case 0x3C: k=2; break; //2
case 0x4C: k=3; break; //3
case 0x4A: k=4; break; //4
case 0x5C: k=5; break; //5
case 0x6C: k=6; break; //6
case 0x7A: k=7; break; //7
case 0x7C: k=8; break; //8
case 0x8C: k=9; break; //9
case 0x38: k=10; break; //a
case 0x64: k=11; break; //b
case 0x42: k=12; break; //c
case 0x46: k=13; break; //d
case 0x48: k=14; break; //e
case 0x56: k=15; break; //f
case 0x68: k=16; break; //g
case 0x66: k=17; break; //h
case 0x86: k=18; break; //i
case 0x76: k=19; break; //j
case 0x84: k=20; break; //k
case 0x96: k=21; break; //l
case 0x74: k=22; break; //m
case 0x62: k=23; break; //n
case 0x88: k=24; break; //o
case 0x9A: k=25; break; //p
case 0x2A: k=26; break; //q
case 0x5A: k=27; break; //r
case 0x36: k=28; break; //s
case 0x58: k=29; break; //t
case 0x78: k=30; break; //u
case 0x54: k=31; break; //v
case 0x3A: k=32; break; //w
case 0x44: k=33; break; //x
case 0x6A: k=34; break; //y
case 0x34: k=35; break; //z
case 0x98: k=63; break; //;
case 0xAA: k=65; break; //=
case 0xF2: k=68; break; //+
case 0x52: k=-16;break; //空格键
case 0xB0: k=101;break; //大小写控制键Caps lock
}
if(k==101) {dx=!dx;} //按下大小写控制键时 大小写标志取反
if(k==-16) //空格键按下时
{
lcd_putchar8x8(lie, hang, -16+'0'); //清除光标
lcd_putchar8x8(lie+8, hang, 79+'0');//光标移一位
}
if(dx==0) //小写状态时显示
{
lcd_putchar8x8(lie, hang, k+'0');//小写字符
lcd_putchar8x8(lie+8, hang, 79+'0');//光标
}
if(dx==1)//大写状态时显示
{
if(k>9 && k<=35)
{
lcd_putchar8x8(lie, hang, (k+26)+'0');//大写字符
lcd_putchar8x8(lie+8, hang, 79+'0');//光标
}
if(k>=0 && k<=9)
{
lcd_putchar8x8(lie, hang, (k-10)+'0');//数字键对应的符号
lcd_putchar8x8(lie+8, hang, 79+'0');//光标
}
}
if(lie==120) //写满一行
{lie=0;hang=hang+1;//换行
lcd_putchar8x8(lie, hang, 79+'0');}//光标下移
else {lie=lie+8;}
EA=1;
}
}
void delay(int x) //延时程序
{ int i,j;
for(i=0;i<600;i++)
for(j=0;j<x;j++); }
void wlcome() //开机画面和欢迎界面
{
lcd_init(); //初始化液晶驱动硬件
lcd_clr(); //清屏
Disp_Img(yema);//显示一张128X64的点阵的图片
delay(200); //延时等待
lie=20;//列的值可以是0--127任意一个
hang=1;//行的值视情况而定
lcd_clr(); //清屏使残留的点不影响后面的显示
hz_disp(lie+0, hang, huan);//显示汉字'欢'
hz_disp(lie+16,hang, ying);//显示汉字'迎'
hz_disp(lie+32,hang, shi);//显示汉字'使'
hz_disp(lie+48,hang, yong);//显示汉字'用'
hz_disp(lie+64,hang, DP);//显示字母'DP'
hz_disp(lie+80,hang, Y);//显示字母'Y'
lie=8;hang=4;//换行 一行有8个点阵 一列只有一个
hz_disp(lie+24,hang, shu );//显示汉字'输'
hz_disp(lie+40,hang, ru);//显示汉字'入'
hz_disp(lie+56,hang, xi);//显示汉字'系'
hz_disp(lie+72, hang, tong);//显示汉字'统'
delay(200);lcd_clr();
lie=8; hang=0;
hz_disp(lie+16,hang, qing);//显示汉字'请'
hz_disp(lie+32,hang, shu);//显示汉字'输'
hz_disp(lie+48,hang, ru);//显示汉字'入'
hz_disp(lie+64,hang, zi);//显示汉字'字'
hz_disp(lie+80,hang, fu);//显示汉字'符'
for(lie=0;lie<128;lie++)//画一条直线
{set_point(lie,15);}
}
void main()
{
wlcome() ; //调用开机画面和欢迎界面子程序
IT1 = 1; //设外部中断1为下降沿触发
EA = 1; //开总中断
EX1=1; //开中断 1
hang=2; lie=0;//输入的字符从第2行 第0列开始显示
while(1)
{
Decode();
delay(50);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -