KTMT
KTMT
Hồ Sỹ Nguyên 22119203
Huỳnh Kim Phát 22119209
1
Bài 1: CHẠY LED
#include <reg51.h>
void main() {
unsigned i;
while (1) {
P0 = 0x00;
//sangdan
for(i=0;i<8;i++){
P0 = (P0<<1)|0x01;
delay(100000000);
}
//tatdan
for(i=0;i<8;i++){
P0= P0<<1 ;
delay(100000000);}
}
}
#include <REGX52.h>
#define Do0 P1_0
#define Do1 P1_1
#define Vang0 P1_2
#define Vang1 P1_3
#define Xanh0 P1_4
#define Xanh1 P1_5
#define SW_chedo P1_6
#define SW P1_7
#define dvi_DT P0_0
#define chuc_DT P0_1
#define dvi_BN P0_2
#define chuc_BN P0_3
#define Display P2
unsigned char Code7seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90};
int dem;
int tanso;
void delay_ms(unsigned int time)
{
unsigned int x, y;
for (x = 0; x < time; x++)
{
for (y = 0; y < 50; y++)
;
}
}
void Traffic_Auto(void)
{
Do0 = 0x01;
Do1 = 0x00;
Vang0 = 0x00;
Vang1 = 0x00;
Xanh0 = 0x00;
Xanh1 = 0x01;
// delay10s
for (dem = 18; dem >= 3; dem--)
{
for (tanso = 0; tanso < 35; tanso++)
{
int dem2 = dem - 3;
int chuc = dem2 / 10;
int dvi = dem2 % 10;
dvi_DT = 1;
Display = Code7seg[dem % 10];
delay_ms(10);
dvi_DT = 0;
dvi_BN = 1;
Display = Code7seg[dvi];
delay_ms(10);
dvi_BN = 0;
chuc_DT = 1;
Display = Code7seg[dem / 10];
delay_ms(10);
chuc_DT = 0;
chuc_BN = 1;
Display = Code7seg[chuc];
delay_ms(10);
chuc_BN = 0;
}
}
Vang0 = 0x00;
Vang1 = 0x01;
Xanh0 = 0x00;
Xanh1 = 0x00;
// delay3s
for (dem = 2; dem >= 0; dem--)
{
for (tanso = 0; tanso < 35; tanso++)
{
dvi_DT = 1;
Display = Code7seg[dem % 10];
delay_ms(10);
dvi_DT = 0;
dvi_BN = 1;
Display = Code7seg[dem % 10];
delay_ms(10);
dvi_BN = 0;
chuc_DT = 1;
Display = Code7seg[dem / 10];
delay_ms(10);
chuc_DT = 0;
chuc_BN = 1;
Display = Code7seg[dem / 10];
delay_ms(10);
chuc_BN = 0;
}
}
Do0 = 0x00;
Do1 = 0x01;
Vang0 = 0x00;
Vang1 = 0x00;
Xanh0 = 0x01;
Xanh1 = 0x00;
// delay10s
dvi_BN = 1;
Display = Code7seg[dem % 10];
delay_ms(10);
dvi_BN = 0;
dvi_DT = 1;
Display = Code7seg[dem % 10];
delay_ms(10);
dvi_DT = 0;
chuc_BN = 1;
Display = Code7seg[dem / 10];
delay_ms(10);
chuc_BN = 0;
chuc_DT = 1;
Display = Code7seg[dem / 10];
delay_ms(10);
chuc_DT = 0;
}
}
}
void main(void)
{
while (SW_chedo == 1)
{
if (SW == 1)
{
if (Do1 == 1)
{
Do0 = 0x00;
Do1 = 0x01;
Vang0 = 0x00;
Vang1 = 0x00;
Xanh0 = 0x01;
Xanh1 = 0x00;
delay_ms(50);
}
Do0 = 0x00;
Do1 = 0x01;
Vang0 = 0x00;
Vang1 = 0x00;
Xanh0 = 0x01;
Xanh1 = 0x00;
dvi_BN = 0;
// Display = Code7seg[dem % 10];
delay_ms(10);
}
if (SW == 0)
{
if (Do0 == 1)
{
Do0 = 0x01;
Do1 = 0x00;
Xanh0 = 0x00;
Xanh1 = 0x01;
Vang0 = 0x00;
Vang1 = 0x00;
delay_ms(50);
}
Do0 = 0x01;
Do1 = 0x00;
Xanh0 = 0x00;
Xanh1 = 0x01;
Vang0 = 0x00;
Vang1 = 0x00;
dvi_BN = 0;
// Display = Code7seg[dem % 10];
delay_ms(10);
}
}
while (SW_chedo == 0)
{
Traffic_Auto();
}
}
#include <AT89X52.h>
int chedo = 1;
int chuyenhuong = 1;
int chuyenVang = 0;
int i;
P3_6 = 0; /*clock canh len*/
P3_5 = 0;/*chan chot du lieu*/
/*74hc595 nhan du lieu noi tiep khi xung canh lenh SH_CP tac dong,
moi xung canh len la nhan 1 bit
xuat du lieu khi xung canh lenh ST_CP tac dong*/
for (i = 0; i < 8; i++) {
P3_4 = Status>>7; // dich stt sang phai 7 bit , gan gtri vAO P3_4
Status <<=1; //dich trai 1 bit , de day them cac bit
delay_ms(1);
P3_6 = 1;
delay_ms(1);
P3_6 = 0; // moi xung giup ic ghi 1 bit du lieu tu P3_4 vao thanh ghi
}
P3_5 = 1;
//ghi du 8 bit vao thanh ghi dich , kich hoat chan de xuat du lieu
}
/*chi ho tro so 2 chu so*/ // chuyen so cac den
void HienThiSoChay(char *Huong, int demA, int demB) {
int tanso;
int dem;
for (dem = demA; dem >= demB; dem--) {
if (chedo == 1) {
return;
}
for (tanso = 0; tanso < 60; tanso++) {
chonLED = Huong[0];
Display = Code7segCatot[dem % 10]; // don vi
delay_ms(3);
chonLED = Huong[1];
Display = Code7segCatot[(dem - 3) % 10];
delay_ms(3);
chonLED = Huong[2];
Display = Code7segCatot[dem / 10]; // chuc
delay_ms(3);
chonLED = Huong[3];
Display = Code7segCatot[(dem - 3) / 10];
delay_ms(3);
Display = 0x00;
delay_ms(3);
}
}
}
/*chi ho tro so 2 chu so*/ // hieu ung nhap nhay
void HienThiSoVang(char *Huong, int demA, int demB) {
int tanso;
int dem;
for (dem = demA; dem >= demB; dem--) {
if (chedo == 1) // ngat dot ngot
{
return;
}
for (tanso = 0; tanso < 60; tanso++) {
chonLED = Huong[0];
Display = Code7segCatot[dem % 10]; // hang don vi
delay_ms(3);
chonLED = Huong[1];
Display = Code7segCatot[dem % 10];
delay_ms(3);
chonLED = Huong[2];
Display = Code7segCatot[dem / 10]; // hang chuc
delay_ms(3);
chonLED = Huong[3];
Display = Code7segCatot[dem / 10];
delay_ms(3);
Display = 0x00;
delay_ms(3);
}
}
}
void Traffic_Auto(void) {
// delay10s
HienThiDen(StatusLED[0]);
HienThiSoChay(BNsochay, 25, 4);
// delay3s
HienThiDen(StatusLED[1]);
HienThiSoVang(BNsochay, 4, 0);
// delay10s
HienThiDen(StatusLED[2]);
HienThiSoChay(DTsochay, 25, 4);
// delay3s
HienThiDen(StatusLED[3]);
HienThiSoVang(DTsochay, 4, 0);
}
void Interrupt_Timer0(void) {
/* f = 12M hz*/
/*f vào timer 0 = 12M/12 = 1M*/
/*T = 1/6M s*/
/* 1000 --> 1ms*/
/*64536--> 65535 -> 0 = 1ms*/
/* 16 bits timer */
TMOD = 0x01;
/* setup 1ms for overforlow */
TH0 = 0xFC;
TL0 = 0x18;
/* Enable interrupt */
ET0 = 1;
EA = 1;
/* Enable timer0 */
TR0 = 1;
}
void main(void) {
Interrupt_Timer0();/*1ms interrupt se kiem tra trang thai chan SW_chedo*/
while (1) {
if (chedo) {
P0 = 0x00;
if (SW == 0) {
delay_ms(100);
if (SW == 1) {
chuyenhuong++;
}
if (chuyenhuong > 1)
chuyenhuong = 0;
}
if (chuyenhuong) {
if(chuyenVang){
HienThiDen(StatusLED[3]);
delay_ms(2000);
}
HienThiDen(StatusLED[0]);
chuyenVang = 0;
} else {
if(!chuyenVang){
HienThiDen(StatusLED[1]);
delay_ms(2000);
}
HienThiDen(StatusLED[2]);
chuyenVang = 1;
}
} else
Traffic_Auto();
}
}
BÀI 4 LỊCH VẠN NIÊN
#include"main.h"
#include"..\lib\Soft_I2c.h"
#include"..\lib\Lcd4.h"
#include"..\lib\Rtc_Ds1307.h"
#include"..\lib\LunarCalendar.h"
#include"Port.h"
void main()
{
unsigned char Hour, Minute, Second, Mode, Day, Date, Month, Year,
old_second;
unsigned char SolarDate, SolarMonth;
char SolarYear;
Soft_I2c_Init();
Ds1307_Init();
Lcd_Init();
while(1)
{
Ds1307_Read_Time(&Hour, &Minute, &Second, &Mode);
if(old_second != Second)
{
old_second = Second;
Lcd_Chr(1,5,Hour/10+0x30);
Lcd_Chr_Cp(Hour%10+0x30);
Lcd_Chr_Cp(':');
Lcd_Chr_Cp(Minute/10+0x30);
Lcd_Chr_Cp(Minute%10+0x30);
Lcd_Chr_Cp(':');
Lcd_Chr_Cp(Second/10+0x30);
Lcd_Chr_Cp(Second%10+0x30);
void Lcd_Init()
{
LCD_RS = 0;
LCD_EN = 0;
#ifdef USE_LCD_RW
LCD_RW = 0;
#endif
Delay_ms(20);
Lcd_Write_Low_Nibble(0x03);
LCD_EN = 1;
LCD_EN = 0;
Delay_ms(5);
Lcd_Write_Low_Nibble(0x03);
LCD_EN = 1;
LCD_EN = 0;
Lcd_Delay_us(100);
Lcd_Write_Low_Nibble(0x03);
LCD_EN = 1;
LCD_EN = 0;
#ifdef USE_CHECK_BUSY
Lcd_Busy();
#else
Delay_ms(1);
#endif
Lcd_Write_Low_Nibble(0x02);
LCD_EN = 1;
LCD_EN = 0;
Delay_ms(1);
Lcd_Cmd(_LCD_4BIT_2LINE_5x7FONT);
Lcd_Cmd(_LCD_TURN_ON);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_ENTRY_MODE);
}
#ifdef USE_CHECK_BUSY
Lcd_Busy();
#else
switch(cmd)
{
case _LCD_CLEAR:
case _LCD_RETURN_HOME:
Delay_ms(2);
break;
default:
Lcd_Delay_us(37);
break;
}
#endif
}
Lcd_Write_Low_Nibble(achar);
LCD_EN = 1;
LCD_EN = 0;
#ifdef USE_CHECK_BUSY
Lcd_Busy();
#else
Lcd_Delay_us(37+4);
#endif
}
void Soft_I2c_Init()
{
SOFT_I2C_SCL=1;
SOFT_I2C_SDA=1;
}
void Soft_I2c_Start()
{
SOFT_I2C_SCL = 1;
Soft_I2c_Delay();
SOFT_I2C_SDA = 0;
Soft_I2c_Delay();
SOFT_I2C_SCL = 0;
}
bit Soft_I2c_Get_Ack()
{
bit result;
SOFT_I2C_SDA = 1;
Soft_I2c_Delay();
SOFT_I2C_SCL = 1;
Soft_I2c_Delay();
result = SOFT_I2C_SDA;
SOFT_I2C_SCL = 0;
return result;
}
void Soft_I2c_Ack()
{
SOFT_I2C_SDA = 0;
Soft_I2c_Delay();
SOFT_I2C_SCL = 1;
Soft_I2c_Delay();
SOFT_I2C_SCL = 0;
}
void Soft_I2c_Nak()
{
SOFT_I2C_SDA = 1;
Soft_I2c_Delay();
SOFT_I2C_SCL = 1;
Soft_I2c_Delay();
SOFT_I2C_SCL = 0;
}
void Soft_I2c_Stop()
{
SOFT_I2C_SDA = 0;
Soft_I2c_Delay();
SOFT_I2C_SCL = 1;
Soft_I2c_Delay();
SOFT_I2C_SDA = 1;
}
#include"LunarCalendar.h"
//2000
0x1B79,0x099A,0x1A3A,0x125B,0x187B,0x109D,0x1ABE,0x18E2,0x1304,0x
1924,0x1346,0x1B66,
//2001
0x1987,0x0229,0x1A47,0x1068,0x1A89,0x108A,0x1AAB,0x18CC,0x10EE,0x1
B0F,0x1130,0x1B51,
//2002
0x1972,0x0394,0x1A32,0x1253,0x1873,0x1295,0x18B5,0x1AD7,0x10F8,0x191
9,0x133B,0x195B,……
//2099}
lr.Word = LUNAR_CALENDAR_LOOKUP_TABLE[(SolarYear-
BEGINNING_YEAR)*12+SolarMonth -1];
N_AL_DT_DL = lr.Info.N_AL_DT_DL;
T_AL_DT_DL = lr.Info.T_AL_DT_DL;
SN_CT_AL = lr.Info.SN_CT_AL + 29;
TN_B_THT = lr.Info.TN_B_THT;
lr.Word = LUNAR_CALENDAR_LOOKUP_TABLE[(SolarYear-
BEGINNING_YEAR)*12+SolarMonth];
N_AL_DT_DL_TT = lr.Info.N_AL_DT_DL;
T_AL_DT_DL_TT = lr.Info.T_AL_DT_DL;
// Tinh Nam
if(SolarMonth >= (*LunarMonth))
{
(*LunarYear) = SolarYear;
}
else
{
(*LunarYear) = SolarYear - 1;
}
}
BÀI 5 LỊCH VẠN NIÊN TRÊN KIT
#include <reg52.h> // Thư viện dành cho 8051, cung cấp các định nghĩa
cho cổng I/O và thanh ghi
sbit RST = P3^5; // Chân Reset (RST) của DS1302, dùng để bắt đầu
hoặc kết thúc giao tiếp
sbit SCLK = P3^6; // Chân xung clock (SCLK) để đồng bộ hóa dữ liệu
truyền và nhận
sbit BUTTON = P3^7; // Chân kết nối nút nhấn, dùng để chuyển đổi giữa
hiển thị thời gian và ngày tháng
unsigned char mode = 0; // Biến chế độ: 0 hiển thị thời gian, 1 hiển thị
ngày tháng
unsigned char debounce = 0; // Biến chống dội phím (debounce) khi nhấn nút
unsigned char code SEG_CODE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D,
0x07, 0x7F, 0x6F};
void delay_ms(unsigned int ms); // Hàm tạo độ trễ tính bằng mili giây
void DisplayTime(void); // Hàm hiển thị thời gian trên LED 7 đoạn
void DisplayDate(void); // Hàm hiển thị ngày tháng trên LED 7 đoạn
void SetTime(void);
*/
void main() {
DS1302_Init(); // Khởi tạo DS1302 (đặt các chân RST và SCLK ở trạng
thái ổn định)
// SetTime(); // Cài đặt thời gian ban đầu
while (1) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 123; j++); // Dựa trên tần số dao động của vi điều khiển
(~12MHz)
void DS1302_Init(void) {
unsigned char i;
RST = 1; // Kích hoạt giao tiếp DS1302 bằng cách đặt RST ở mức cao
IO = addr & 0x01; // Xuất bit thấp nhất của địa chỉ lên chân I/O
IO = dat & 0x01; // Xuất bit thấp nhất của dữ liệu lên chân I/O
addr |= 0x01; // Chuyển địa chỉ sang chế độ đọc (bit thấp nhất = 1)
IO = addr & 0x01; // Xuất bit thấp nhất của địa chỉ
if (IO) dat |= 0x80; // Nếu IO = 1, đặt bit cao nhất của dữ liệu
}
// Hàm chọn LED 7 đoạn thông qua IC 74HC138 - giãi mã 3-8
SELECT_A = seg & 0x01; // Bit 0 của seg điều khiển SELECT_A
SELECT_B = (seg >> 1) & 0x01; // Bit 1 của seg điều khiển SELECT_B
SELECT_C = (seg >> 2) & 0x01; // Bit 2 của seg điều khiển SELECT_C
/*
void SetTime(void) {
unsigned char hour = 12, minute = 30, second = 0; // Thời gian mặc định
unsigned char date = 25, month = 11, year = 24; // Ngày tháng mặc định
DS1302_WriteByte(0x84, hour);
DS1302_WriteByte(0x82, minute);
DS1302_WriteByte(0x80, second);
DS1302_WriteByte(0x86, date);
DS1302_WriteByte(0x88, month);
DS1302_WriteByte(0x8C, year);
*/
void DisplayTime(void) {
hour = DS1302_ReadByte(0x85);
minute = DS1302_ReadByte(0x83);
second = DS1302_ReadByte(0x81);
SelectSegment(7); delay_ms(5);
SelectSegment(6); delay_ms(5);
SelectSegment(4); delay_ms(5);
SelectSegment(3); delay_ms(5);
SelectSegment(1); delay_ms(5);
SelectSegment(0); delay_ms(5);
void DisplayDate(void) {
date = DS1302_ReadByte(0x87);
month = DS1302_ReadByte(0x89);
year = DS1302_ReadByte(0x8D);
SelectSegment(7); delay_ms(5);
SelectSegment(6); delay_ms(5);
SelectSegment(4); delay_ms(5);
SelectSegment(3); delay_ms(5);
SelectSegment(1); delay_ms(5);
SelectSegment(0); delay_ms(5);
}
BÀI 6 ĐIỀU KHIỂN TỪ XA
#include "reg52.h" // Bao gồm thư viện chuẩn cho vi điều khiển
8051, cung cấp các định nghĩa cổng I/O
sbit BUTTON0 = P1^0; // Chân nút nhấn 0 (P1^0) để điều khiển LED0
sbit BUTTON1 = P1^1; // Chân nút nhấn 1 (P1^1) để điều khiển LED1
sbit BUTTON2 = P1^2; // Chân nút nhấn 2 (P1^2) để điều khiển LED2
unsigned char IrValue[6]; // Mảng lưu trữ giá trị tín hiệu IR nhận
được (6 byte)
unsigned char Time; // Biến đếm thời gian (dùng để phân biệt các tín hiệu
IR nhận được với nhau)
unsigned char i;
for (i = 0; i < 13; i++) {} // Mỗi lần lặp tạo độ trễ nhỏ (khoảng 0.14ms)
}
}
void IrInit()
// Hàm xử lý ngắt IR
unsigned char j, k;
err = 1000; // Thời gian chờ cho tín hiệu bắt đầu (9ms)
while((IRIN == 0) && (err > 0)) // Chờ tín hiệu xuống trong khoảng 9ms
DelayMs(1);
err--;
err = 500;
while((IRIN == 1) && (err > 0)) // Chờ tín hiệu lên trong khoảng 4.5ms
DelayMs(1);
err--;
// Hàm đọc IR
// Đọc bit 0
err = 60;
DelayMs(1);
err--;
// Đọc bit 1
err = 500;
while((IRIN == 1) && (err > 0)) // Chờ tín hiệu lên
trong khoảng 560us
DelayMs(1);
err--;
if (Time > 30) // Nếu quá thời gian quy định, thoát
return;
if (Time >= 8) // Nếu thời gian lên dài hơn 565us, ghi
1 vào bit hiện tại
IrValue[k] |= 0x80;
// Hàm chính
void main()
unsigned char i;
IrInit(); // Khởi tạo IR, thiết lập các ngắt và cấu hình tín hiệu IR
while(1)
// Kiểm tra tín hiệu IR và điều khiển LED dựa trên giá trị nhận được
// Kiểm tra trạng thái của các nút nhấn để điều khiển LED
LED0 = ~LED0; // Đảo trạng thái của LED0 (bật/tắt khi nhấn nút)
#include"reg51.h"
#include"XPT2046.h"
#define GPIO_DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit led=P2^7;
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
// 0 1 2 3 4 5 6 7 8 9 A B C D E
unsigned char timerValue;//luu giá trị thời gian đo được giữa các xung
char pulseCount = 0;// đếm số lượng ir đã nhận từ 0 – 32 để hoàn thành một khung ir
void Timer0_Init(void);
void DigDisplay(void);
unsigned int i, j;
void main(void)
uint temp;
uint sec=5;
P2 = 0xFF; //
Timer0_Init(); //
EA = 1; //
while (1)
else led=1;
// đèn tắt
irKey = Decode_IRKey(newKey);
// giai ma phim
ToggleLED(irKey);
//
for(sec=5; sec>=0;sec--)
LSA=0;
LSB=0;
LSC=0;
GPIO_DIG=DIG_CODE[sec];
delay(1000);
if(sec==0)
{ToggleLED(irKey); break; }
}
}
void DigDisplay(void)
unsigned char i;
unsigned int j;
for(i=0;i<8;i++)
switch(i) //
case(0):
case(1):
case(2):
case(3):
case(4):
case(5):
case(7):
GPIO_DIG=DisplayData[i];//?
j=50; //
while(j--);
GPIO_DIG=0x00;//
switch (key)
returnValue = 1;
break;
returnValue = 2;
break;
returnValue = 3;
break;
default:
break;
}
return returnValue;
msCount++;
// Cấu hình lại giá trị timer 0 để tiếp tục đếm 1ms
TH0 = 0xFC;
msCount = 0;
TH0 = 0xFC;
pulseCount++;
if ((timerValue >= 50)) // đánh dấu bắt đầu khung dữ liệu (Start Of Frame)
else if ((pulseCount >= 0) && (pulseCount < 32)) // Tich luy gia tri bit tu 0 den 31
bitPattern |= (unsigned long)1 << (31 - pulseCount);// Phép dịch bit (<<) được
sử dụng để tạo một giá trị chỉ chứa 1 bit 1 tại vị trí cụ thể,
}
else if (pulseCount >= 32) // Ket thuc khung khi nhan du 32 bit
pulseCount = 0;
void Timer0_Init(){
TH0 = 0xFC;
IT0 = 1; // Cau hinh ngat ngoai INT0 kich hoat ? canh xuong
case 1:
break;
case 2:
break;
case 3:
#include"XPT2046.h"
void SPI_Start(void)
CLK = 0;
CS = 1;
DIN = 1;
CLK = 1;
CS = 0;
uchar i;
CLK = 0;
dat <<= 1;
CLK = 0;
CLK = 1;
uint SPI_Read(void)
uint i, dat=0;
CLK = 0;
dat <<= 1;
CLK = 1;
CLK = 0;
dat |= DOUT;
return dat;
{
uchar i;
uint AD_Value;
CLK = 0;
CS = 0;
SPI_Write(cmd);
CLK = 1;
_nop_();
_nop_();
CLK = 0;
_nop_();
_nop_();
AD_Value=SPI_Read();
CS = 1;
return AD_Value;
#include <regx52.h>
#include <stdlib.h>
/* Difficulty */
#define TIMER0_COUNTER_MAX 10
#define SNAKE_MAX_LENGTH 64
#define GAME_OVER 1
#define GAME_PLAYING 0
/* Counter variables */
unsigned char timer2_counter = 0;// đếm các hàm hiển thị trên ma trận led
unsigned char timer0_counter = 0;// đếm số chu ky timer 0 để quyết định khi nào rắn di
chuyển
unsigned char xdata displayBuffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};// lưu dữ liệu hiển thị cho
ma trân môi phần tử đại diện cho một hàng
10
};
/* A point on display */
typedef struct {
unsigned char x;
unsigned char y;
} Point;
/* Game objects */
Point apple;
unsigned char snakeLength = 0;
unsigned char snakeDirection = 0;//luu hướng di chuyển hiện tại của rắn r,l,u,d
void Snake_Display();
void Apple_Create();
void Apple_Display();
void Display_Clear();
void Display_Point(Point);
void Keypad_Read();
char Keypad_Check();
char Keypad_Position(unsigned short value);// chuyển đổi giá trj cua ban phím thành
chỉ số trong mang keypad
/*//////////////////////////////////////2////////////////////////////*/
void Matrix_StartDisplay();
void Game_Init();
void Game_Start();
void Game_Stop();
void main () {
char key_clicked = 0;
char pre_key_clicked = 0;
/* Setup */
P0 = 0;
EA = 1;
LATCH = 0;
DATA = 0;
CLOCK = 0;
/* Start display */
Matrix_StartDisplay();
Game_Init();
while(1){
key_clicked = keypad[Keypad_Check()];
Game_Init();
Game_Start();
snakeDirection = key_clicked;
pre_key_clicked = key_clicked;
}
void Snake_Display(){
/*//////////////////////////////////////////3//////////////////////////*/
Display_Clear();
Apple_Display();
Display_Point(snake[counter2]);
void Snake_Step(){
Point snake_tail;
switch (snakeDirection)
/* Turn right */
case 'r':
if(snake[0].x == 8){
snake [0].x = 0;
break;
/* Turn left */
case 'l':
if (snake[0].x == 255){
snake [0].x = 7;
break;
case 'u':
}
snake [0].y++; //Try to go up
if(snake[0].y == 8){
snake [0].y = 0;
break;
case 'd':
if(snake[0].y == 255){
snake[0].y = 7;
break;
default:
break;
snake[snakeLength].x = snake_tail.x;
snake[snakeLength].y = snake_tail.y;
/*///////////////////////////////////////////////////////////////////*/
if(isSnakeHitItself()){
Game_Stop();
Snake_Display();
if (returnValue) break;
return returnValue;
void Apple_Display(){
Display_Point (apple);
void Apple_Create(){
do
{
apple.x = ((unsigned int) rand()) % 8;
if(check) break;
while (check);
void Display_Clear(){
/*/////////////////////////////////////////////////////////////////////////////*/
displayBuffer [counter2] = 0;
/* Display a Point */
char Keypad_Check(){
// mỗi lần đọc gái trị P1 sẽ thu được 4 bit giá trị cổng và dịch chúng vào clickpos
P1 = 0xef;
P1 = 0xdf;
P1 = 0xbf;
P1 = 0x7f;
return Keypad_Position(clickPos);
case 0xf7:
returnvalue = 0;
break;
case 0xfb:
returnvalue = 1;
break;
case 0xfd:
returnvalue = 2;
break;
case 0xfe:
returnvalue = 3;
break;
case 0x7f:
returnvalue = 4;
break;
case 0xbf:
returnvalue = 5;
break;
case 0xdf:
returnvalue = 6;
break;
case 0xef:
returnvalue = 7;
break;
default:
case 0xf7:
returnvalue = 8;
break;
case 0xfb:
returnvalue = 9;
break;
case 0xfd:
returnvalue = 10;
break;
case 0xfe:
returnvalue = 11;
break;
case 0x7f:
returnvalue = 12;
break;
case 0xbf:
returnvalue = 13;
break;
case 0xdf:
returnvalue = 14;
break;
case 0xef:
returnvalue = 15;
break;
/*/////////////////////////////////////////////////////////////*/
break;
return returnvalue;
TL0 = 0x00;
TH0 = 0x04;
timer0_counter++;
if(timer0_counter == TIMER0_COUNTER_MAX){
timer0_counter = 0;
Snake_Step();
void Game_Init(){
snakeLength = 3;
apple.x = 5;
apple.y = 5;
snake [2].x = 3;
snake [2].y = 3;
snake [1].x = 4;
snake [1].y = 3;
snake [0].x = 5;
snake [0].y = 3;
/* Initial direction */
snakeDirection = 'r';
gameState = GAME_OVER;
Snake_Display();
void Game_Start(void)
TMOD |= 0x01;
TL0 = 0x00;
TH0 = 0x04;
TF0 = 0;
TR0 = 1;
//[email protected]
//Set timer work mode
/*///////////////////////////////////////////////////*/
ET0 = 1;
gameState = GAME_PLAYING;
void Game_Stop(){
TR0 = 0;
gameState = GAME_OVER;
TF2 = 0;
DATA = timer2_counter == 0;
CLOCK = 1;
P0 = ~displayBuffer[7 - timer2_counter];// đảo giá trị của từng trạng thái của từng phần
tử
LATCH = 1;
timer2_counter++;
if(timer2_counter == 8) timer2_counter = 0;
CLOCK = 0;
LATCH = 0;
void Matrix_StartDisplay(void)
T2MOD =0;
T2CON = 0;
TL2 = 0xCD;
TH2 = 0xF8;
RCAP2L = 0xCD;
RCAP2H = 0xF8;
TR2 =1;
ET2 = 1;