📄 keyp.c
字号:
#include<2.h>
#include<math.h>
#include<stdio.h>
#include<intrins.h>
#include <absacc.h>
#include <setjmp.h>
#include<string.h>
void main(void)
{
ssp=20;
ver=1;
initLCD();
LCDwriteByte(0x01,0);
CPRST=NORM;
FLASHADDR=0xffff;
disp_page();
Timer4_Init(N);
while(1) {
check_key();
if (FLASHADDR!=0xFFFF) //有闪烁
{
if (numm%2==0)
DATALCD[FLASHADDR]=FLASHDATA[FLASHTAB];
else
DATALCD[FLASHADDR]=' ';
}
LCDwritePage();
}
}
void initLCD(void)
{
delayus(40000); //wait 40ms
CLRBIT(P4,RSTLCD); //power on to reset >50ns
delayus(1000); //1ms,reset pulse width >10us
SETBIT(P4,RSTLCD);
delayus(1000);
CLRBIT(P4,CSLCD);
delayus(1000);
CLRBIT(P4,SCKLCD);
delayus(1000);
LCDwriteByte(0x30,0); //base instruction set,功能设定,基本指令集操作
LCDwriteByte(0x30,0); //base instruction set
LCDwriteByte(0x01,0); //clr screen,>10ms,清除显示屏幕,把DDRAM位址计数器调整为“00H”
delayus(10000);
LCDwriteByte(0x06,0); //move direction of cursor & screen,光标右移,整体显示不移动
LCDwriteByte(0x0C,0); //display on,no cursor,整体显示ON, 游标OFF,游标位置OFF
}
void check_busyLCD(void)
{ unsigned char ctemp;
unsigned char dat;
unsigned char LCDctr=0xFC;
for (ctemp=8;ctemp>0;ctemp--) //syn bit string
{
CLRBIT(P4,SCKLCD); //上升沿写
if (ISBITSET(LCDctr,ctemp-1))
SETBIT(P4,STDLCD);
else
CLRBIT(P4,STDLCD);
delayus(2); //SCLK width>0.3us
SETBIT(P4,SCKLCD);
delayus(2);
}
dat=STDLCD;
while((dat&0x80)==0x80);
}
//LCDctrl=1 for data, =0 for command
void LCDwriteByte(unsigned char LCDdata,unsigned char LCDctrl)
{
unsigned int itemp;
unsigned char ctemp;
if (LCDctrl==1) LCDctrl=0xFA;
else LCDctrl=0xF8;
itemp=(LCDdata&0xF0)*256+(LCDdata&0x0F)*16;// 把数据转化为16位的十进制数
SETBIT(P4,CSLCD); //选中液晶
//写同步字符
for (ctemp=8;ctemp>0;ctemp--) //syn bit string
{
CLRBIT(P4,SCKLCD); //上升沿写
if (ISBITSET(LCDctrl,ctemp-1))
SETBIT(P4,STDLCD);
else
CLRBIT(P4,STDLCD);
delayus(2); //SCLK width>0.3us
SETBIT(P4,SCKLCD);
delayus(2);
}
//写数据或指令
for (ctemp=16;ctemp>0;ctemp--) //1 byte
{
CLRBIT(P4,SCKLCD);
if (ISBITSET(itemp,ctemp-1))
SETBIT(P4,STDLCD);
else
CLRBIT(P4,STDLCD);
delayus(2);
SETBIT(P4,SCKLCD);
delayus(2);
}
CLRBIT(P4,CSLCD);
}
void LCDwritePage(void)
{
unsigned char ctemp;
check_busyLCD();
for (ctemp=0;ctemp<32;ctemp++)
{
LCDwriteByte(LCDgetPos(ctemp),0); //position
LCDwriteByte(DATALCD[2*ctemp],1); //high byte
delayus(1000);
LCDwriteByte(DATALCD[2*ctemp+1],1); //low byte
}
}
unsigned char LCDgetPos(unsigned char LCDpos)
{
unsigned char row,col;
row=LCDpos/8; //row=0-3
col=LCDpos-row*8; //col=0-8
return (HZpos[row]+col);
}
//重载,不复制字符串结束符0x00(\0)
void ncstrcpy(unsigned char *dst, const unsigned char *src)
{
while (*src!=0x00)
*dst++=*src++;
}
void Initial(void)
{
P3MDOUT=0x00;
P74OUT =0x00;
WDTCN =0x07; //WATCHDOG TIMER CONTROL,Set WDT max interval
WDTCN =0xDE; //disable WDT
WDTCN =0xAD;
RSTSRC =0x00;
PCON=0x90;
XBR0=0x04;
XBR1=0x00;
XBR2=0x40;//允许交叉开关和弱上拉
EA=1;
OSCXCN =0x67; //外部时钟为晶体振荡器方式
OSCICN =0x08; //选择外部振荡器作为系统时钟,内部振荡典型值为2MHZ;
P0MDOUT|=0x01;
//REF0CN=0X03;//允许内部VREF发生器
}
void Timer4_Init(unsigned int counts)
{
T4CON=0; //停止定时器,设置为自动重载方式
CKCON=0x00; //定时器4使用系统时钟的12分频;
EIE2=0x04; //允许定时器4溢出产生中断;
EIP2=0x04; //设置定时器4中断为高优先级;
RCAP4L=counts;
RCAP4H=counts>>8;
TH4=RCAP4H;
TL4=RCAP4L;
T4CON=0x04; //允许定时器4,并设置为自动重载方式;
}
void Timer4_ISR (void) interrupt 16
{
T4CON &=~0x80; //清除溢出标志位
num++;
if(num%100==0)
{ numm++;
}
}
void delayus (unsigned long tdelay)
{
tdelay=tdelay/2;
while (tdelay>0)
tdelay--;
}
//-------------key-----------------------
void check_key(void)
{
SETBIT(P3,keyenter);
SETBIT(P3,keyesc);
SETBIT(P3,keyadd);
SETBIT(P3,keysub);
ckey=((~P3)&0xF0);
if(ckey!=0){
if (keyenterflag==0)
{ msg_key();
keyenterflag=1;
}
else
keyenterflag=0;
}
}
void msg_key(void)
{ unsigned char i1;
i1=0;
IKEYSTUS=TBSTUS[i1];
while (IKEYSTUS!=CPRST)
{
i1+=4;
IKEYSTUS=TBSTUS[i1];
}
i1++;
IKEYSTUS=TBSTUS[i1];
while(IKEYSTUS!=0&&(IKEYSTUS!=ckey))
{
i1+=4;
IKEYSTUS=TBSTUS[i1];
}
CPRST=TBSTUS[i1+2];
CPRAMADDR=TBSTUS[i1+1];
switch(CPRAMADDR)
{
case NEXTTRIGLE1:disp_sigle();break;
case NEXTTRIGLE2:disp_cunchu();break;
case NEXTTRIGLE3:disp_page();break;
case SETSUB:set_SUB();break;
case SETCLEAR:set_CLEAR();break;
case SETNEXT:set_NEXT();break;
case SETADD: set_ADD();break;
// case NEXTPAGE3:disp_page0();break;
//case SETNEXT2:set_NEXT();break;
// case SETADD2:set_ADD1();break;
}
ckey=0;
}
void set_CLEAR(void)
{
disp_page();
}
void disp_page (void)
{
LCDwriteByte(0x01,0);
sprintf(DATALCD+26,"%2d",ssp);
sprintf(DATALCD+44,"%3f",ver);
ncstrcpy(DATALCD+4,"数字示波器");
ncstrcpy(DATALCD+16,"扫描速度 s
");
ncstrcpy(DATALCD+32,"垂直灵敏度 v");
ncstrcpy(DATALCD+48,"连续显示 ");
LCDwritePage();
FLASHADDR=0XFFFF;
}
void disp_sigle(void)
{
ncstrcpy(DATALCD+48,"单次触发 ");
LCDwritePage();
}
void disp_cunchu(void)
{
ncstrcpy(DATALCD+48,"存储 ");
LCDwritePage();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -