📄 zuopin3.c
字号:
//认真研究时序图,按时间顺序操作硬件
//针对HJD162A型号的lcd显示器
//IOA0--rs,IOA1--rw,IOA2--E,IOA8~OA15--DB0~DB7,IOB0--key1,IOB1--key2;
#include<spce061a_chf.h>
#define Uint unsigned int
typedef struct
{
Uint bit0 : 1;
Uint bit1 : 1;
Uint bit2 : 1;
Uint bit3 : 1;
Uint bit4 : 1;
Uint bit5 : 1;
Uint bit6 : 1;
Uint bit7 : 1;
Uint bit8 : 1;
Uint bit9 : 1;
Uint bit10 : 1;
Uint bit11 : 1;
Uint bit12 : 1;
Uint bit13 : 1;
Uint bit14 : 1;
Uint bit15 : 1;
}Bit;
typedef struct
{
Uint bytel : 8;
Uint byteh : 8;
}Byte;
typedef union
{
Bit bit;
Byte byte;
Uint port;
}UNport;
#define PA ((volatile UNport *)(0x7000))
#define PA_Buffer ((volatile UNport *)(0x7001))
#define PA_Dir ((volatile UNport *)(0x7002))
#define PA_Attrib ((volatile UNport *)(0x7003))
#define PA_Latch ((volatile UNport *)(0x7004))
#define PB ((volatile UNport *)(0x7005))
#define PB_Buffer ((volatile UNport *)(0x7006))
#define PB_Dir ((volatile UNport *)(0x7007))
#define PB_Attrib ((volatile UNport *)(0x7008))
#define P0_0 PA->bit.bit0
#define P0_1 PA->bit.bit1
#define P0_2 PA->bit.bit2
#define P0_3 PA->bit.bit3
#define P0_4 PA->bit.bit4
#define P0_5 PA->bit.bit5
#define P0_6 PA->bit.bit6
#define P0_7 PA->bit.bit7
#define P0_8 PA->bit.bit8
#define P0_9 PA->bit.bit9
#define P0_10 PA->bit.bit10
#define P0_11 PA->bit.bit11
#define P0_12 PA->bit.bit12
#define P0_13 PA->bit.bit13
#define P0_14 PA->bit.bit14
#define P0_15 PA->bit.bit15
#define P1_0 PB->bit.bit0
#define P1_1 PB->bit.bit1
#define P1_2 PB->bit.bit2
#define P1_3 PB->bit.bit3
#define P1_4 PB->bit.bit4
#define P1_5 PB->bit.bit5
#define P1_6 PB->bit.bit6
#define P1_7 PB->bit.bit7
#define P1_8 PB->bit.bit8
#define P1_9 PB->bit.bit9
#define P1_10 PB->bit.bit10
#define P1_11 PB->bit.bit11
#define P1_12 PB->bit.bit12
#define P1_13 PB->bit.bit13
#define P1_14 PB->bit.bit14
#define P1_15 PB->bit.bit15
void lcd_init(void);//包括初始化和设置
void write_command(unsigned int);//写命令函数
void write_data(unsigned int);//写数据函数
void check_busy(void);//检测busy信号的函数
void delay15(void);
void delay5(void);
unsigned int a[5]="K=150";
main()
{
unsigned int data=150;
unsigned int l,k=5;
Set_IOB_Dir(0xf0);
Set_IOB_Attrib(0xf4);
Set_IOB_Data(0x04);//IOB0~IOB1为键盘的下拉输入,IOB2为EXIT1的悬浮式输入,IOB4~IOB7为控制端口的低电平输出
lab:lcd_init();
for(l=0;l<k;l++)
{
write_data(a[l]);
}
while(1)
{
Watchdog_Clear();
if(P1_0==1)//"+10'
{
do
{
Watchdog_Clear();
}while(P1_0==1);//等待按键释放
if(data<=150)
{
data+=10;
if(data<100)
{
a[2]=data/10+48;
k=4;
}
else
{
a[2]='1';
a[3]=(data-100)/10+48;
k=5;
}
}
Set_IOB_Data((~((data/10)<<4))&0xf0);//设置A.B.C.D
goto lab;//有改变的时候才从新显示
}
if(P1_1==1)//'-10'
{
do
{
Watchdog_Clear();
}while(P1_1==1);//等待按键释放
if(data!=1)
{
data-=10;
if(data>=100)
{
a[3]=(data-100)/10+48;
k=5;
}
else if((data>=10)&(data<100))
{
a[2]=data/10+48;
k=4;
}
else
{
data=1;
k=3;
}
}
Set_IOB_Data((~((data/10)<<4))&0xf0);//设置A.B.C.D
goto lab;//有改变的时候才从新显示
}
}
}
//初始化函数
void lcd_init(void)
{
write_command(0x38);//显示模式的设置
write_command(0x08);//显示关闭*/
write_command(0x0c);//整体显示,关光标,不闪烁
write_command(0x06);//显示光标移动设置
write_command(0x01); //显示清屏
}
//写命令函数,IOA0~IOA2为控制端口,IOA8~IOA15为数据端口
void write_command(unsigned int command)
{
check_busy();
Set_IOA_Dir(0xff07);
Set_IOA_Attrib(0xff07);
PA->byte.byteh=command;//操作高8位
P0_0=0;//rs=0
P0_1=0;//rw=0
P0_2=1;//E=1
asm("nop");
P0_2=0;//E=0;//下降沿触发
asm("nop");
}
//写数据函数
void write_data(unsigned int data2)
{
check_busy();
Set_IOA_Dir(0xff07);
Set_IOA_Attrib(0xff07);
PA->byte.byteh=data2;//操作高8位
P0_0=1;//rs=1
P0_1=0;//rw=0
P0_2=1;//E=1
asm("nop");
P0_2=0;//E=0;//下降沿触发
asm("nop");
}
void check_busy()
{
unsigned int c;
Set_IOA_Dir(0x0007);
Set_IOA_Attrib(0xff07);
Set_IOA_Data(0xff00);//悬浮式输入
do
{
Watchdog_Clear();
P0_0=0;//rs=0
P0_1=1;//rw=1
P0_2=1;//E=1
c=PA->byte.byteh;//只读出高8位
P0_2=0;//E=0;
asm("nop");
c&=0x80;
}while(c==0x80);
}
void delay15()
{
unsigned int i,j;
i=2;
while(i--)
{
j=0x2fff;
while(j--)
{
Watchdog_Clear();
}
}
}
void delay5()
{
unsigned int i,j;
i=0;
while(i--)
{
j=0x2fff;
while(j--)
{
Watchdog_Clear();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -