หน้าเว็บ

วันพุธที่ 23 ธันวาคม พ.ศ. 2558

LAB4 นับจำนวนการกดสวิตซ์

LAB 4
นับจำนวนการกดสวิตซ์

 เงื่อนไข
        เขียนโปรแกรมนับการกดสวิตซ์โดยให้แสดงค่าผ่านหลอด LED จำนวน 8 หลอดโดยแสดงเพิ่มทีละหลอดตามจำนวนที่กด เช่น กดสามครั้ง ก็ติดสามหลอด เป็นต้นเมื่อกดครั้งที่ 9 ให้กลับไปแสดงเหมือนครั้งที่ 1 และมีสวิตซ์สำหรับรีเซคค่าให้เป็น 0 (ดับหมด)
จงเขียนโปรแกรมควบคุม 16F887 และจำลองการทำงานของวงจรด้วย โปรแกรม Proteus

กำหนดขาอินพุตเอาต์พุต
ขา RC0 คือ สวิตซ์
ขา RC1 คือ สวิตซ์รีเซ็ต
ขา RDทั้งหมดเป็นเอาพุตท์

เริ่มต้นเขียน
#include<pic.h>
__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);
#define _XTAL_FREQ  20000000
void main(void)
{char countIN;
TRISC1=1;
TRISC2=1;
TRISD=0;
PORTD=0;
while(1)
{if(RC1==0)
{__delay_ms(200);
countIN=countIN+1;
if(countIN==9){countIN=1;}
if(countIN==1){RD7=0;RD6=0;RD5=0;RD4=0;RD3=0;RD2=0;RD1=0;RD0=1;}
if(countIN==2){RD7=0;RD6=0;RD5=0;RD4=0;RD3=0;RD2=0;RD1=1;RD0=1;}
if(countIN==3){PORTD=0b00000111;}
if(countIN==4){RD7=0;RD6=0;RD5=0;RD4=0;RD3=1;RD2=1;RD1=1;RD0=1;}
if(countIN==5){PORTD=0b00011111;}
if(countIN==6){PORTD=0b00111111;}
if(countIN==7){PORTD=0x7F;}
if(countIN==8){PORTD=255;}
while(!RC1);
}
if(RC2==0)
{countIN=0;
PORTD=0b00000000;
}
}
}

จำลองการทำงานโดย Proteus
จะคอยอัพเดทนะครับ



วันศุกร์ที่ 4 ธันวาคม พ.ศ. 2558

LAB 4
การออกแบบโปรแกรมกดรหัส 4 ตัว




เงื่อนไข 
            ออกแบบโปรแกรมกดรหัส 4 ตัว โดยการกดแต่ละครั้งจะต้องมีการแสดงที่ LCD ทุกครั้งและกดเรียงกัน 4 ตัว (กดครบ 4 ครั้ง) แล้วกดตามด้วยการกดปุ่ม # เพื่อส่งค่าตรวจสอบ ถ้าตรงตามรหัสที่กำหนด (กำหนดค่าในโปรแกรมก่อนแล้ว) ให้ LED 1 ติด และถ้าไม่ตรงตามรหัสที่กำหนดให้ LED 1 ดับ การป้อนรหัสใหม่ทำได้หลังจากมีการกดปุ่ม * เพื่อลบการแสดงค่าเดิมที่กด (แต่การเข้ามาครั้งแรกกดรหัสได้เลย)
จงเขียนโปรแกรมควบคุม 16F887 และจำลองการทำงานของวงจรด้วย โปรแกรม Proteus

เริ่มต้นเขียน
#include<pic.h>
#include<stdio.h>
#include"LCD16F887.h"
__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);
#define _XTAL_FREQ 20000000
#define COL1 RC1
#define COL2 RC2
#define COL3 RC3
#define ROW1 RC5
#define ROW2 RC6
unsigned char key=0xFF;
unsigned char str[16];
unsigned char get_keypad()
{
unsigned char result=0xFF;
COL1=1; COL2=1; COL3=1;
COL1=0; COL2=1; COL3=1; //COL1
if(ROW1==0){ result='0'; }
else if(ROW2==0){ result='D'; }


COL1=1; COL2=0; COL3=1; //COL2
if(ROW1==0){ result='3'; }
else if(ROW2==0){ result='+'; }


COL1=1; COL2=1; COL3=0;         //COL3
if(ROW1==0){ result='5'; }
else if(ROW2==0){ result='='; }


return result;
}

void main(void)
{ char str[16];
lcd_init();
TRISC=0b11100001;TRISD0=0;
COL1=1; COL2=1; COL3=1;
lcd_puts(0x80,"AAA BBB");
lcd_puts(0xC0," ZZZZ");
int countIN=0,SUM=0,SUM1=0,SUM2=0,A=0,B=0,C=0,a=0,b=0,c=0;
while(1)
{ key=get_keypad();
if(key<0xFF)
{
if(key=='+')
{sprintf(str,"%c",key);
lcd_puts(0x83,str);
key=0xFF;
__delay_ms(100);
countIN=3;
}
if(key=='D')
{ countIN=0;SUM=0;SUM1=0;
SUM2=0;A=0;B=0;C=0;
a=0;b=0;c=0;
key=0xFF;
lcd_puts(0x80,"AAA BBB");
lcd_puts(0xC0," ZZZZ");
}
if((key<0xFF)&&(key!='D')&&(key!='='))
{ if((key<0xFF)&&(countIN==0))
{countIN=countIN+1;
if(key=='0'){A=0;}
if(key=='3'){A=3;}
if(key=='5'){A=5;}
sprintf(str,"%c",key);
lcd_puts(0x82,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==1))
{countIN=countIN+1;
if(key=='0'){B=0;}
if(key=='3'){B=3;}
if(key=='5'){B=5;}
sprintf(str,"%c",key);
lcd_puts(0x81,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==2))
{countIN=countIN+1;
if(key=='0'){C=0;}
if(key=='3'){C=3;}
if(key=='5'){C=5;}
sprintf(str,"%c",key);
lcd_puts(0x80,str);
key=0xFF;
__delay_ms(100);
}

if((key<0xFF)&&(countIN==3))
{countIN=countIN+1;
if(key=='0'){a=0;}
if(key=='3'){a=3;}
if(key=='5'){a=5;}
sprintf(str,"%c",key);
lcd_puts(0x86,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==4))
{countIN=countIN+1;
if(key=='0'){b=0;}
if(key=='3'){b=3;}
if(key=='5'){b=5;}
sprintf(str,"%c",key);
lcd_puts(0x85,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==5))
{
if(key=='0'){c=0;}
if(key=='3'){c=3;}
if(key=='5'){c=5;}
sprintf(str,"%c",key);
lcd_puts(0x84,str);
key=0xFF;
__delay_ms(100);
}
}
if(key=='=')
{ countIN=10;
sprintf(str,"%c",key);
lcd_puts(0xC0,str);
key=0xFF;
__delay_ms(60);
SUM1=((A*1)+(B*10)+(C*100));
SUM2=((a*1)+(b*10)+(c*100));
SUM=SUM1+SUM2;
sprintf(str,"%4d",SUM);
lcd_puts(0xC1,str);
}
}
}
}

จำลองการทำงานโดย Proteus
LAB 4
การออกแบบ




เงื่อนไข 
            บวกเลขไม่เกิน 3 หลัก จากสวิตซ์แบบ Matrix ที่มีปุ่มตัวเลข 0,3,5 พร้อมปุ่มเครื่องหมาย "D", "+", "=" โดยกดตัวเลขได้ไม่เกิน 3 หลัก (น้อยกว่าได้และซ้ำเลขได้) ถ้าเกินต้องไม่ส่งผลใดๆ จากนั้นกดปุ่ม "+" แล้วกดเลขบวกไม่เกิน เช่น (น้อยกว่าได้และซำ้เลขได้) ถ้าต้องไม่ส่งใดๆและแสดงผลบวกเมื่อกดปุ่ม "=" เมื่อต้องการเริ่มใหม่ให้กดที่ปุ่ม "D" แสดงผลที่ LCD บรรทัดที่ 1 แสดงตัวเลขตัวตั้ง เครื่องหมาย  "+" (เมื่อกดปุ่มบวก) และเลขตัวบวก บรรทัดที่สองแสดงผลบวก โดยมีเครื่องหมาย "=" นำหน้า (เมื่อกดปุ่มเท่ากับ)
จงเขียนโปรแกรมควบคุม 16F887 และจำลองการทำงานของวงจรด้วย โปรแกรม Proteus

เริ่มต้นเขียน
#include<pic.h>
#include<stdio.h>
#include"LCD16F887.h"
__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);
#define _XTAL_FREQ 20000000
#define COL1 RC1
#define COL2 RC2
#define COL3 RC3
#define ROW1 RC5
#define ROW2 RC6
unsigned char key=0xFF;
unsigned char str[16];
unsigned char get_keypad()
{
unsigned char result=0xFF;
COL1=1; COL2=1; COL3=1;
COL1=0; COL2=1; COL3=1; //COL1
if(ROW1==0){ result='0'; }
else if(ROW2==0){ result='D'; }


COL1=1; COL2=0; COL3=1; //COL2
if(ROW1==0){ result='3'; }
else if(ROW2==0){ result='+'; }


COL1=1; COL2=1; COL3=0;         //COL3
if(ROW1==0){ result='5'; }
else if(ROW2==0){ result='='; }


return result;
}

void main(void)
{ char str[16];
lcd_init();
TRISC=0b11100001;TRISD0=0;
COL1=1; COL2=1; COL3=1;
lcd_puts(0x80,"AAA BBB");
lcd_puts(0xC0," ZZZZ");
int countIN=0,SUM=0,SUM1=0,SUM2=0,A=0,B=0,C=0,a=0,b=0,c=0;
while(1)
{ key=get_keypad();
if(key<0xFF)
{
if(key=='+')
{sprintf(str,"%c",key);
lcd_puts(0x83,str);
key=0xFF;
__delay_ms(100);
countIN=3;
}
if(key=='D')
{ countIN=0;SUM=0;SUM1=0;
SUM2=0;A=0;B=0;C=0;
a=0;b=0;c=0;
key=0xFF;
lcd_puts(0x80,"AAA BBB");
lcd_puts(0xC0," ZZZZ");
}
if((key<0xFF)&&(key!='D')&&(key!='='))
{ if((key<0xFF)&&(countIN==0))
{countIN=countIN+1;
if(key=='0'){A=0;}
if(key=='3'){A=3;}
if(key=='5'){A=5;}
sprintf(str,"%c",key);
lcd_puts(0x82,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==1))
{countIN=countIN+1;
if(key=='0'){B=0;}
if(key=='3'){B=3;}
if(key=='5'){B=5;}
sprintf(str,"%c",key);
lcd_puts(0x81,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==2))
{countIN=countIN+1;
if(key=='0'){C=0;}
if(key=='3'){C=3;}
if(key=='5'){C=5;}
sprintf(str,"%c",key);
lcd_puts(0x80,str);
key=0xFF;
__delay_ms(100);
}

if((key<0xFF)&&(countIN==3))
{countIN=countIN+1;
if(key=='0'){a=0;}
if(key=='3'){a=3;}
if(key=='5'){a=5;}
sprintf(str,"%c",key);
lcd_puts(0x86,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==4))
{countIN=countIN+1;
if(key=='0'){b=0;}
if(key=='3'){b=3;}
if(key=='5'){b=5;}
sprintf(str,"%c",key);
lcd_puts(0x85,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==5))
{
if(key=='0'){c=0;}
if(key=='3'){c=3;}
if(key=='5'){c=5;}
sprintf(str,"%c",key);
lcd_puts(0x84,str);
key=0xFF;
__delay_ms(100);
}
}
if(key=='=')
{ countIN=10;
sprintf(str,"%c",key);
lcd_puts(0xC0,str);
key=0xFF;
__delay_ms(60);
SUM1=((A*1)+(B*10)+(C*100));
SUM2=((a*1)+(b*10)+(c*100));
SUM=SUM1+SUM2;
sprintf(str,"%4d",SUM);
lcd_puts(0xC1,str);
}
}
}
}

จำลองการทำงานโดย Proteus
LAB 4
โปรแกรมบวกเลขไม่เกิน 3 หลัก




เงื่อนไข 
            บวกเลขไม่เกิน 3 หลัก จากสวิตซ์แบบ Matrix ที่มีปุ่มตัวเลข 0,3,5 พร้อมปุ่มเครื่องหมาย "D", "+", "=" โดยกดตัวเลขได้ไม่เกิน 3 หลัก (น้อยกว่าได้และซ้ำเลขได้) ถ้าเกินต้องไม่ส่งผลใดๆ จากนั้นกดปุ่ม "+" แล้วกดเลขบวกไม่เกิน เช่น (น้อยกว่าได้และซำ้เลขได้) ถ้าต้องไม่ส่งใดๆและแสดงผลบวกเมื่อกดปุ่ม "=" เมื่อต้องการเริ่มใหม่ให้กดที่ปุ่ม "D" แสดงผลที่ LCD บรรทัดที่ 1 แสดงตัวเลขตัวตั้ง เครื่องหมาย  "+" (เมื่อกดปุ่มบวก) และเลขตัวบวก บรรทัดที่สองแสดงผลบวก โดยมีเครื่องหมาย "=" นำหน้า (เมื่อกดปุ่มเท่ากับ)
จงเขียนโปรแกรมควบคุม 16F887 และจำลองการทำงานของวงจรด้วย โปรแกรม Proteus

เริ่มต้นเขียน
#include<pic.h>
#include<stdio.h>
#include"LCD16F887.h"
__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);
#define _XTAL_FREQ 20000000
#define COL1 RC1
#define COL2 RC2
#define COL3 RC3
#define ROW1 RC5
#define ROW2 RC6
unsigned char key=0xFF;
unsigned char str[16];
unsigned char get_keypad()
{
unsigned char result=0xFF;
COL1=1; COL2=1; COL3=1;
COL1=0; COL2=1; COL3=1; //COL1
if(ROW1==0){ result='0'; }
else if(ROW2==0){ result='D'; }


COL1=1; COL2=0; COL3=1; //COL2
if(ROW1==0){ result='3'; }
else if(ROW2==0){ result='+'; }


COL1=1; COL2=1; COL3=0;         //COL3
if(ROW1==0){ result='5'; }
else if(ROW2==0){ result='='; }


return result;
}

void main(void)
{ char str[16];
lcd_init();
TRISC=0b11100001;TRISD0=0;
COL1=1; COL2=1; COL3=1;
lcd_puts(0x80,"AAA BBB");
lcd_puts(0xC0," ZZZZ");
int countIN=0,SUM=0,SUM1=0,SUM2=0,A=0,B=0,C=0,a=0,b=0,c=0;
while(1)
{ key=get_keypad();
if(key<0xFF)
{
if(key=='+')
{sprintf(str,"%c",key);
lcd_puts(0x83,str);
key=0xFF;
__delay_ms(100);
countIN=3;
}
if(key=='D')
{ countIN=0;SUM=0;SUM1=0;
SUM2=0;A=0;B=0;C=0;
a=0;b=0;c=0;
key=0xFF;
lcd_puts(0x80,"AAA BBB");
lcd_puts(0xC0," ZZZZ");
}
if((key<0xFF)&&(key!='D')&&(key!='='))
{ if((key<0xFF)&&(countIN==0))
{countIN=countIN+1;
if(key=='0'){A=0;}
if(key=='3'){A=3;}
if(key=='5'){A=5;}
sprintf(str,"%c",key);
lcd_puts(0x82,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==1))
{countIN=countIN+1;
if(key=='0'){B=0;}
if(key=='3'){B=3;}
if(key=='5'){B=5;}
sprintf(str,"%c",key);
lcd_puts(0x81,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==2))
{countIN=countIN+1;
if(key=='0'){C=0;}
if(key=='3'){C=3;}
if(key=='5'){C=5;}
sprintf(str,"%c",key);
lcd_puts(0x80,str);
key=0xFF;
__delay_ms(100);
}

if((key<0xFF)&&(countIN==3))
{countIN=countIN+1;
if(key=='0'){a=0;}
if(key=='3'){a=3;}
if(key=='5'){a=5;}
sprintf(str,"%c",key);
lcd_puts(0x86,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==4))
{countIN=countIN+1;
if(key=='0'){b=0;}
if(key=='3'){b=3;}
if(key=='5'){b=5;}
sprintf(str,"%c",key);
lcd_puts(0x85,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==5))
{
if(key=='0'){c=0;}
if(key=='3'){c=3;}
if(key=='5'){c=5;}
sprintf(str,"%c",key);
lcd_puts(0x84,str);
key=0xFF;
__delay_ms(100);
}
}
if(key=='=')
{ countIN=10;
sprintf(str,"%c",key);
lcd_puts(0xC0,str);
key=0xFF;
__delay_ms(60);
SUM1=((A*1)+(B*10)+(C*100));
SUM2=((a*1)+(b*10)+(c*100));
SUM=SUM1+SUM2;
sprintf(str,"%4d",SUM);
lcd_puts(0xC1,str);
}
}
}
}

จำลองการทำงานโดย Proteus