並接 RA0 (出發往下)
R38 20K 接低
R39 10K 接 K1 K4 K7
R40 20K 接 K2 K5 K8
R41 30K 接 K3 K6 K9
並接 VCC (出發往下)
R43 10K 接 K1 K2 K3
R44 4.7K 接 K4 K5 K6
R45 2.2K 接 K7 K8 K9
AD01
#include <p18f4520.h>
void ADInit(void){
ADCON0 = 0b00000011;
ADCON1 = 0b00001110;
ADCON2 = 0b00100010;
}
unsigned char ADProc(void){
unsigned char TEMP=1;
if (ADRESH > 1*32){ TEMP = 1;}
if (ADRESH > 2*32){ TEMP = 2;}
if (ADRESH > 3*32){ TEMP = 3;}
if (ADRESH > 4*32){ TEMP = 4;}
if (ADRESH > 5*32){ TEMP = 5;}
if (ADRESH > 6*32){ TEMP = 6;}
if (ADRESH > 7*32){ TEMP = 7;}
if (ADRESH > 250){ TEMP = 8;}
ADCON0bits.GO=1;
return TEMP;
}
LCD 及主程式
#include <p18f4520.h>
#include <delays.h>
unsigned char ADProc (void);
void ADInit(void);
#define LCD_E LATAbits.LATA2
#define LCD_RS LATDbits.LATD4
#define LCD_RW LATDbits.LATD5
#define LCD_DATA LATD
void LCDCMD( unsigned char CMD);
void LCDCHAR ( unsigned char DATA);
void LCDCMD( unsigned char CMD){
unsigned char TEMP;
TEMP = CMD;
LCD_DATA = ( LCD_DATA & 0b11110000 ) | ( TEMP >> 4);
LCD_RS = 0;
LCD_RW = 0;
Nop();Nop();
LCD_E = 1;
Nop();Nop();
LCD_E = 0;
//----------------
LCD_DATA = (LCD_DATA & 0b11110000) | ( TEMP & 0b00001111 ) ;
LCD_RS = 0;
LCD_RW = 0;
Nop();Nop();
LCD_E = 1;
Nop();Nop();
LCD_E = 0;
Delay10TCYx(16/4 *4);
}
void LCDCHAR ( unsigned char DATA){
unsigned char TEMP;
TEMP = DATA;
LCD_DATA = ( LCD_DATA & 0b11110000 ) | ( TEMP >> 4);
LCD_RS = 1;
LCD_RW = 0;
Nop();Nop();
LCD_E = 1;
Nop();Nop();
LCD_E = 0;
//----------------
LCD_DATA = (LCD_DATA & 0b11110000) | ( TEMP & 0b00001111 ) ;
LCD_RS = 1;
LCD_RW = 0;
Nop();Nop();
LCD_E = 1;
Nop();Nop();
LCD_E = 0;
Delay10TCYx(16/4 *4);
}
void Init(void){
TRISD = 0b00000000;
ADCON1 = 0b00001111;
TRISA = 0b11111011;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 0;
}
void LCDCLEAR(void){
LCDCMD(0b00000001);
Delay10KTCYx(16/4 * 5);
}
void main (void){
unsigned char VAL;
Init();
Delay10KTCYx(16/4 *50); //0.5Sec
LCDCMD(0b00101000);
LCDCMD(0b00101000); //Function Set
LCDCMD(0b00001110); //Display On/Off
LCDCMD(0b00000110); //Entry Mode
LCDCMD(0b00010100); //Cursor
LCDCLEAR(); //Clear
ADInit();
while(1){
Delay10KTCYx(16/4*10);
VAL = ADProc();
LCDCMD(0b10000000);
switch (VAL){
case 1:
LCDCHAR(0xFF);
LCDCHAR(' ');LCDCHAR(' ');LCDCHAR(' ');LCDCHAR(' ');
LCDCHAR(' ');LCDCHAR(' ');LCDCHAR(' ');
break;
case 2:
LCDCHAR(0xFF);LCDCHAR(0xFF);
LCDCHAR(' ');LCDCHAR(' ');LCDCHAR(' ');LCDCHAR(' ');
LCDCHAR(' ');LCDCHAR(' ');
break;
case 3:
LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);
LCDCHAR(' ');LCDCHAR(' ');LCDCHAR(' ');LCDCHAR(' ');
LCDCHAR(' ');
break;
case 4:
LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);
LCDCHAR(' ');LCDCHAR(' ');LCDCHAR(' ');LCDCHAR(' ');
break;
case 5:
LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);
LCDCHAR(0xFF);
LCDCHAR(' ');LCDCHAR(' ');LCDCHAR(' ');
break;
case 6:
LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);
LCDCHAR(0xFF);LCDCHAR(0xFF);
LCDCHAR(' ');LCDCHAR(' ');
break;
case 7:
LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);
LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);
LCDCHAR(' ');
break;
case 8:
LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);
LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);LCDCHAR(0xFF);
break;
}
}
}
為何我的 LCD 從開始3*3鍵盤的接法,不能一個一個的亮,
按鍵1 2格
按鍵2,5,6,7,8 3格
按鍵3, 4格
我希望按鍵1是一格,按鍵7是七格,8是八格,9是歸零
附檔是APP001的線路圖
Edited by Ryang on 2009年10月29日 11:54:29