📄 main._c
字号:
uchar fnPR1(uchar uCmd,uchar uPar1,uchar uPar2) //写双参数的指令
{
if(fnST01() == 0)
return 1;
LCMDW = uPar1;
if(fnST01() == 0)
return 2;
LCMDW = uPar2;
if(fnST01() == 0)
return 3;
LCMCW = uCmd;
return 0; // 返回0成功
}
uchar fnPR11(uchar uCmd,uchar uPar1) // 写单参数的指令
{
if(fnST01() == 0)
return 1;
LCMDW = uPar1;
if(fnST01() == 0)
return 2;
LCMCW = uCmd;
return 0; // 返回0成功
}
}
*/
void fnPR11(uchar lcd_code,uchar lcd_data1)
{
lcd_wd(lcd_data1);
lcd_wc(lcd_code);
}
/*
uchar fnST3(void) // 状态位ST3判断(数据自动写状态)
{
uchar data i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x08) == 0x08)
break;
}
return i; // 若返回零,说明错误
}
*/
uchar fnST3(void) // 状态位ST3判断(数据自动写状态)
{
uchar i;
for(i=10;i>0;i--)
{
//if((LCMCW & 0x08) == 0x08)
break;
}
return i; // 若返回零,说明错误
}
uchar fnGetRow(void)
{
return gCurRow;
}
uchar fnGetCol(void)
{
return gCurCol;
}
// 设置当前地址
void fnSetPos(uchar urow, uchar ucol)
{
uint iPos;
iPos = urow * 30 + ucol;
lcd_wc3(LC_ADD_POS,iPos & 0xFF,iPos / 256);
gCurRow = urow;
gCurCol = ucol;
}
// 设置当前显示行、列
void cursor(uchar uRow, uchar uCol)
{
fnSetPos(uRow * 16, uCol);
}
//清汉字行函数,参数1起始行,参数2终止行
void clsrows(uchar brow,uchar erow)
{
uint i;
union address baddr;
baddr.a = 480*brow;
lcd_wc3(LC_ADD_POS,baddr.apart.al,baddr.apart.ah);
lcd_wc(LC_AUT_WR);
for(i=0;i<(erow-brow)*30;i++)
{
fnST3();
lcd_wd(0x00);
}
lcd_wc(LC_AUT_OVR);
lcd_wc3(LC_ADD_POS,baddr.apart.al,baddr.apart.ah);
gCurRow = brow<<4;
gCurCol = 0;
}
void fnLCMInit(void)
{
lcd_wc3(LC_TXT_STP,0x00,0x0f); // 文本显示区首地址 10
lcd_wc3(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
lcd_wc3(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
lcd_wc3(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
lcd_wc(LC_CUR_SHP | 0x00); // 光标形状
lcd_wc3(LC_CGR_POS,0x03,0x00); //CGRAM设置
lcd_wc(LC_MOD_OR); // 显示方式设置
lcd_wc(0x9f); // 显示开关设置
}
/***********************************************************************************/
void lcd_init(void)
{
LCD_RES_H;
LCD_RES_L; //低电平复位
delay_ms(30);
LCD_RES_H;
lcd_wc(0x80); //设置显示模式为逻辑“或”模式
lcd_wc(0x98); //开显示
lcd_wc3(0x40,0,0); //设置文本显示区首地址
lcd_wc3(0x41,30,0); //设置文本显示区宽度
lcd_wc3(0x42,0,0); //设置图形显示区首地址
lcd_wc3(0x43,30,0); //设置图形显示区宽度
lcd_wc3(LC_TXT_STP,0x00,0x0f) ; // 文本显示区首地址 10
lcd_wc3(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
lcd_wc3(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
lcd_wc3(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
lcd_wc(LC_CUR_SHP | 0x00); // 光标形状
lcd_wc3(LC_CGR_POS,0x03,0x00); //CGRAM设置
lcd_wc(LC_MOD_OR); // 显示方式设置
lcd_wc(0x9C); // 显示开关设置,允许文本图形显示,关闭光标
}
// 清屏
void cls(void)
{
uint i;
lcd_init(); // 调用初始化
lcd_wc3(LC_ADD_POS,0x00,0x00); // 置地址指针
lcd_wc(LC_AUT_WR); // 自动写
for(i=0;i<4608;i++)
{
lcd_wd(0x00); // 写数据
}
lcd_wc(LC_AUT_OVR); // 自动写结束
lcd_wc3(LC_ADD_POS,0x00,0x00); // 重置地址指针
gCurRow = 0; // 置地址指针存储变量
gCurCol = 0;
}
/***********************************************************************************/
void lcd_fill(uchar lcd_data)
{
uchar i,j;
lcd_wc(0x98); /* 打开图形显示,关闭文本显示 */
lcd_wc3(0x24,0,0); /* 设置地址指针 */
lcd_wc(0xb0); /* 设置自动写数据 */
for(i=0;i<128;i++)
{
for(j=0;j<30;j++)
{
lcd_wd(lcd_data);/* Write display data */
}
}
lcd_wc(0xb2); /* Awroff (auto reset) */
}
/***********************************************************************************/
void lcd_print(uchar x,uchar y,uchar lcd_data)
{
lcd_wc(0x98);
lcd_wc3(0x24,x,y);
lcd_wc(0xb0);
lcd_wd(lcd_data);
lcd_wc(0xb2);
}
/******************************************************************************/
void lcd_print240128(cchar *str)
{
uchar i,j;
lcd_wc(0x98);
lcd_wc3(0x24,0,0);
lcd_wc(0xb0);
for(i=0;i<128;i++)
{
for(j=0;j<30;j++)
{
lcd_wd(*str++);
}
}
lcd_wc(0xb2);
}
void lcd_digtal(cchar *str)
{
uchar i,j;
cursor(6,0);
// lcd_wc(0x98);
// lcd_wc3(0x24,0,0);
lcd_wc(0xb0);
for(i=0;i<32;i++)
{
for(j=0;j<30;j++)
{
lcd_wd(*str++);
}
}
lcd_wc(0xb2);
}
// ASCII(8*16) 及 汉字(16*16) 显示函数
uchar dprintf(uchar *fmt, ...)
{
va_list arg_ptr;
uchar c1,c2,cData;
uchar tmpBuf[64]; // LCD显示数据缓冲区
uchar i=0,j,uLen,uRow,uCol;
uint k;
va_start(arg_ptr, fmt);
uLen = (uchar)vsprintf(tmpBuf, fmt, arg_ptr);
va_end(arg_ptr);
while(i<uLen)
{
c1 = tmpBuf[i];
c2 = tmpBuf[i+1];
uRow = fnGetRow();
uCol = fnGetCol();
if(c1 <128) //if(c1 >= 0) 此处与Keli不同处理,C1,C2,Cdata必须改为uchar
{ // ASCII
if(c1 < 0x20)
{
switch(c1)
{
case CR:
case LF: // 回车或换行
i++;
if(uRow < 112)
fnSetPos(uRow+16,0);
else
fnSetPos(0,0);
continue;
case BS: // 退格
if(uCol > 0)
uCol--;
fnSetPos(uRow,uCol);
cData = 0x00;
break;
default: // 其他
c1 = 0x1f;
}
}
for(j=0;j<16;j++)
{
lcd_wc(LC_AUT_WR); // 写数据
if(c1 >= 0x1f)
{
if(j < (16-ASC_CHR_HEIGHT))
lcd_wd(0x00);
else
lcd_wd(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]);
}
else
lcd_wd(cData);
lcd_wc(LC_AUT_OVR);
fnSetPos(uRow+j+1,uCol);
}
if(c1 != BS) // 非退格
uCol++;
}
else
{ // 中文
for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
{
if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
break;
}
for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
{
fnSetPos(uRow+k,uCol);
lcd_wc(LC_AUT_WR); // 写数据
if(j < sizeof(GB_16)/sizeof(GB_16[0]))
{
lcd_wd(GB_16[j].Msk[k*2]);
lcd_wd(GB_16[j].Msk[k*2+1]);
}
else // 未找到该字
{
if(k < sizeof(GB_16[0].Msk)/4)
{
lcd_wd(0x00);
lcd_wd(0x00);
}
else
{
lcd_wd(0xff);
lcd_wd(0xff);
}
}
lcd_wc(LC_AUT_OVR);
}
uCol += 2;
i++;
}
if(uCol >= 30) // 光标后移
{
uRow += 16;
if(uRow < 0x80)
uCol -= 30;
else
{
uRow = 0;
uCol = 0;
}
}
fnSetPos(uRow,uCol);
i++;
}
return uLen;
}
//T6963驱动代码结束
void cgram(void)
{
uchar i,j;
lcd_wc3(LC_ADD_POS,0x00,0x1C);
lcd_wc(LC_AUT_WR);
for(i=8;i>0;i--)
for(j=8;j>0;j--)
{
if(j<=i)
lcd_wd(0x18);
else
lcd_wd(0x00);
}
lcd_wc(LC_AUT_OVR);
}
//Mega32芯片初始化
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
//uart0_init();
//watchdog_init();
timer0_init();
timer1_init();
//adc_init();
MCUCR = 0x01; //
GICR = 0x40; //
TIMSK = 0x05; //timer1,timer0 interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
uint Times,tempfreq,tempadc;
uchar temp,i;
uchar TimesFlag;
union uint2uchars nn;
union address addr;
uchar pulse_pos = 3;
uchar exitcounter=0;
addr.a = 0x0000;
init_devices();
uart_str("Jiangshu Zhenjiang Ibonding \n");
lcd_init();
cls();
lcd_print240128(ourcompany);
WDR();
beeps(2);
delay_ms(500);
WDR();
delay_ms(500);
WDR();
cls();
WDR();
while (1) {
WDR();
tempfreq=Freq;
tempfreq=tempfreq%100000;
DisplayBuffer[0] = tempfreq/10000+0x30;
tempfreq=tempfreq%10000;
DisplayBuffer[1] = tempfreq/1000+0x30;
tempfreq=tempfreq%1000;
DisplayBuffer[2] = tempfreq/100+0x30;
tempfreq=tempfreq%100;
DisplayBuffer[3] = tempfreq/10+0x30;
DisplayBuffer[4] = tempfreq%10+0x30;
DisplayBuffer[5] = 'H';
DisplayBuffer[6] = 'z';
DisplayBuffer[7] = '\0';
cursor(0,1);
dprintf("%s",DisplayBuffer); //display Freq
tempfreq=keycounter;
DisplayBuffer[0] = tempfreq/100+0x30;
tempfreq=tempfreq%100;
DisplayBuffer[1] = tempfreq/10+0x30;
DisplayBuffer[2] = tempfreq%10+0x30;
DisplayBuffer[3] = '\0';
cursor(1,1);
dprintf("%s",DisplayBuffer); //display keycounter
cursor(2,1);
if (keydirection==0);
dprintf("%s","减少");
else
dprintf("%s","增加");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -