📄 hgfgd.txt
字号:
1 E-1330点阵液晶屏驱动程序
2 HT1380实时时钟驱动程序
3 ht9200b驱动程序
4 按键扫描驱动程序
//E-1330点阵液晶屏驱动程序/*
线路图
89C51 E-1330
--------
| 8
P1.0-1.7|=========== D0-7
|
P3.0|----------- A0
P3.1|----------- R/W
P3.2|----------- E
| -- /CS
| |
| ---
| 反相器
RESET |----|>。--- /RES
--------
*/
#include <reg51.h>
sbit p_a0=P3^0;
sbit p_rw=P3^1;
sbit p_e=P3^2;
//指令写入函数
void ctrl(unsigned char c) {
p_a0=1; //a0为1代表写入指令
p_rw=0;
p_e=1;P1=c;p_e=0;
}
//数据和指令参数写入函数
void write(unsigned char d) {
p_a0=0; //a0为0代表写入数据或指令参数
p_rw=0;
p_e=1;P1=d;p_e=0;
}
//数据和光标地址读出函数
unsigned char read(void) {
unsigned char rd;
p_a0=1; //a0为1代表读数据和光标地址,a0为0代表读状态标志,由于E-1330功能很强,一般不用读状态标志
p_rw=1;
P=0xff; //把P1置为高电平,只有置为高电平才能正确读入数据
p_e=1;rd=P1;p_e=0;
return(rd);
}
/*
其他函数可以根据资料自行组合,
如设置CGROM相对地址为0000H,用以下语句即可:
ctrl(0x5c); //写入5C指令
write(0);
write(0); //写入5C指令的参数0000
*/
//HT1380实时时钟驱动程序
sbit clock_dat=P0^1;
sbit clock_clk=P0^2;
sbit clock_rst=P0^3;
sbit a0=ACC^0;
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;
void clock_out(unsigned char dd) {
ACC=dd;
clock_dat=a0;clock_clk=1;clock_clk=0;
clock_dat=a1;clock_clk=1;clock_clk=0;
clock_dat=a2;clock_clk=1;clock_clk=0;
clock_dat=a3;clock_clk=1;clock_clk=0;
clock_dat=a4;clock_clk=1;clock_clk=0;
clock_dat=a5;clock_clk=1;clock_clk=0;
clock_dat=a6;clock_clk=1;clock_clk=0;
clock_dat=a7;clock_clk=1;clock_clk=0;
}
unsigned char clock_in(void) {
clock_dat=1;
a0=clock_dat;
clock_clk=1;clock_clk=0;a1=clock_dat;
clock_clk=1;clock_clk=0;a2=clock_dat;
clock_clk=1;clock_clk=0;a3=clock_dat;
clock_clk=1;clock_clk=0;a4=clock_dat;
clock_clk=1;clock_clk=0;a5=clock_dat;
clock_clk=1;clock_clk=0;a6=clock_dat;
clock_clk=1;clock_clk=0;a7=clock_dat;
return(ACC);
}
unsigned char read_clock(unsigned char ord) {
unsigned char dd=0;
clock_clk=0;
clock_rst=0;
clock_rst=1;
clock_out(ord);
dd=clock_in();
clock_rst=0;
clock_clk=1;
return(dd);
}
void write_clock(unsigned char ord,unsigned char dd) {
clock_clk=0;
clock_rst=0;
clock_rst=1;
clock_out(ord);
clock_out(dd);
clock_rst=0;
clock_clk=1;
}
//ht9200b驱动程序
sbit a0=ACC^0;
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;
sbit dtmf_dat=P2^6;
sbit dtmf_clk=P2^7;
sbit dtmf_ce=P2^4;
void out_dtmf(unsigned char dd) {
ACC=dd;
dtmf_dat=a0;dtmf_clk=0;dtmf_clk=1;
dtmf_dat=a1;dtmf_clk=0;dtmf_clk=1;
dtmf_dat=a2;dtmf_clk=0;dtmf_clk=1;
dtmf_dat=a3;dtmf_clk=0;dtmf_clk=1;
dtmf_dat=a4;dtmf_clk=0;dtmf_clk=1;
}
//按键扫描驱动程序
unsigned char key,key_h,kpush;
unsigned int key_l;
//按键连接到p1.0、p1.1、p1.2
void int_t0(void) interrupt 1 {
unsigned char dd,i;
TL0=TL0+30;TH0=0xfb; //800
/* 按键判别 */
if ((P1&0x7)==0x7) {
if ((key_l>30)&&(key_l<800)&&(key_h>30)) { //释放按键,如果之前按键时间少于1秒,读入键值
key=kpush;
}
if ((++key_h)>200) key_h=200;
key_l=0;
if (key>=0x80) key=0; //如果之前的按键为长按1秒,清除键值
} else {
kpush=P1&0x7;
key_l++;
if ((key_l>800)&&(key_h>30)) { //如果按键超过1秒,键值加0x80标志长按键
key=kpush|0x80;
key_h=0;
key_l=0;
}
}
}
void main(void) {
TMOD=0x1;TR0=1;ET0=1;EA=1;
while (1) {
while (!key) {}
switch (key) {
case 1:break;
case 2:break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -