標題: 這個LcdShowDat為什么沒有調用呀,搞不懂呀 [打印本頁]

作者: 單片機好難啊!    時間: 2018-12-24 15:13
標題: 這個LcdShowDat為什么沒有調用呀,搞不懂呀
void delay_ms(unsigned int d);
void ScanKeyboard();
void LcdShowStr(unsigned char x,unsigned char y,unsigned char*str);
void LcdShowDat(unsigned char x,unsigned char y,unsigned char dat);
unsigned char cnt=0,w=0,key=0;
unsigned char code KeyCode[]=
{0xe7,0xd7,0xb7,0x77,0xeb,0xdb,0xbb,0x7b,0xed,0xdd,0xdb,0xbd,0x7d,0xee,0xde,0xbe,0x7e};
void main()
{       
        unsigned char temp;
        unsigned char str[]="hello";
        TMOD=0X01;
        TH0=0X4C;
        TL0=0X00;
        IE=0X82;
        TR0=1;
        InitLcd1602();
        LcdShowStr(2,0,str);
        while(1);
        {
        temp=w;
        LcdShowDat(4,1,temp);
        }
}
void LcdWaitReady()
{
        unsigned char sta;
        LCD1602_DB=0XFF;
        LCD1602_RS=0;
        LCD1602_RW=1;
        do{
                LCD1602_E=1;
                sta=LCD1602_DB;
                LCD1602_E=0;
        }
        while(sta&0x80);
}
void LcdWriteCmd(unsigned char cmd)
{
        LcdWaitReady();
        LCD1602_RS=0;
        LCD1602_RW=0;
        LCD1602_DB=cmd;
        LCD1602_E=1;
        LCD1602_E=0;
}
void LcdWriteDat(unsigned char dat)
{
        LcdWaitReady();
        LCD1602_RS=1;
        LCD1602_RW=0;
        LCD1602_DB=dat;
        LCD1602_E=1;
        LCD1602_E=0;
}
void LcdSetCursor(unsigned char x,unsigned char y)
{
        unsigned char addr;
        if(y==0)
        addr=0x00+x;
        else
        addr=0x40+x;
        LcdWriteCmd(addr|0x80);
}
void LcdShowStr(unsigned char x,unsigned char y,unsigned char*str)
{
        LcdSetCursor(x,y);
        while(*str!='\0')
        {
                LcdWriteDat(*str++);
        }
}
void LcdShowDat(unsigned char x,unsigned char y,unsigned char dat)
{
        LcdSetCursor(x,y);
        LcdWriteDat(dat);
}
void InitLcd1602()
{
        LcdWriteCmd(0x38);
        LcdWriteCmd(0x0c);
        LcdWriteCmd(0x06);
        LcdWriteCmd(0x01);
}
void ScanKeyboard()
{
        unsigned char scan1,scan2,keyboard;
        unsigned char i;
        P2=0xf0;
        scan1=P2;
        if((scan1&0xf0)!=0xf0)
        {
                delay_ms(10);
                scan1=P2;
                if((scan1&0xf0)!=0xf0)
                {
                        P2=0xf0;
                        scan2=P2;
                        keyboard=scan1|scan2;
                        while((P2&0x0f)!=0x0f)
                        for(i=0;i<=15;i++)
                        {
                                if(keyboard==KeyCode[i])
                                key=i;
                        }
                }
        }
}
void clock()interrupt 1
{
        unsigned char key,i;
        cnt++;
        TH0=0X4C;
        TL0=0X00;
        ScanKeyboard();
        if(key==1)
        {
                w=0x20;
        }
        if(key==2)
        {
                for(i=0;cnt<=20;i++)
                {
                 w=0x61+0x01;
                 if(i==3)
                 {
                         i=0;
                         w=0x61;
                 }
                }
        }
}
void delay_ms(unsigned int d)
{
        unsigned char i;
        while(d--)
        {                                                                                                                                       
                for(i=0;i<=110;i++);
        }
}
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_LCDSHOWDAT?ABC


作者: robinsonlin    時間: 2018-12-24 17:52
主程序最后一個語句不是么?
另外,你這個程序能跑起來么? 真的有點佩服。建議你還是先初步了解一下單片機的教程,你框架結構有很大的問題。  中斷里面處理了太多事,還沒有等中斷恢復,第二次中斷就該響應了。
作者: 地瓜你干啥呢    時間: 2018-12-24 17:54
子程序調用函數(shù)是不是有問題,是不是涉及到是否修改數(shù)值問題。三種傳值方式




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1