#include"include.h"
uchar lcdtab[3][10][3]={{{0x07,0x01,0x03},{0x04,0x00,0x02},{0x06,0x03,0x01},
{0x06,0x02,0x03},{0x05,0x02,0x02},{0x03,0x02,0x03},{0x03,0x03,0x03},{0x06,0x00,0x02},
{0x07,0x03,0x03},{0x07,0x02,0x03}},
{{0x18,0x14,0x0c},{0x10,0x10,0x00},{0x18,0x08,0x0c},
{0x18,0x18,0x08},{0x10,0x1c,0x00},{0x08,0x1c,0x08},{0x08,0x1c,0x0c},{0x18,0x10,0x00},
{0x18,0x1c,0x0c},{0x18,0x1c,0x08}},
{{0x60,0x40,0x70},{0x00,0x40,0x40},{0x40,0x60,0x30},
{0x40,0x60,0x60},{0x20,0x60,0x40},{0x60,0x20,0x60},{0x60,0x20,0x70},{0x40,0x40,0x40},
{0x60,0x60,0x70},{0x60,0x60,0x60}}}; // 筆段式液晶 的seg口的 單片機 io口隱映射表,根據不同的筆段式lcd即可自行制表。。。,上面是1/2偏壓,1/3占空比筆段式lcd的編碼,三個com口通過兩個電阻接到公共時鐘端io口,兩電阻抽頭接到lcd的com端,seg口可直接接單片機io口。。
uchar com;
uchar counter;
uint slashtime;
uchar flashweisel;
#pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF
void timer0_ovf_isr(void)
{
uchar segb,segc;
TCNT0 = 0x83; //reload counter value
flshtm++;
counter++;
if(counter==8)//每過八毫秒,換行掃描,總共三行,共24ms一幀,幀頻達到40hz左右
{
counter=0;
segb=lcdtab[0][wei6][com]|lcdtab[1][wei5][com]|lcdtab[2][wei4][com];
segc=lcdtab[0][wei3][com]|lcdtab[1][wei2][com]|lcdtab[2][wei1][com];
以下的兩個if else 語句是實現位閃爍功能的,可以去掉,不影響正常顯示
if(flshtm<slashtime)
flashweisel=0;
else if(flshtm>(slashtime*2))
flshtm=0;
if((flashweisel>=4)&&(flashweisel<=6))
segb &= (~lcdtab[6-flashweisel][8][com]);
else if(flashweisel)
segc &= (~lcdtab[3-flashweisel][8][com]);
PORTB=segb;
PORTC=segc;
PORTD=0x70&(~(1<<(com+4)));// 掃描com口
if(++com==3)com=0;//com++,//逐行掃描每個com口
}
if(counter%4==0)//每過4ms翻轉一次,即交流
{
PORTC=~PORTC;
PORTB=~PORTB;
PORTD=(~PORTD)&0xf7;
}
}
|