SOGO論壇
標題:
七段顯示器 到數的程式碼
[列印本頁]
作者:
grass0423
時間:
2013-1-17 15:22:26
標題:
七段顯示器 到數的程式碼
請問一下有人可以幫我看一下嗎??
#include <reg51.h> //IC為AT89C51
#include <stdlib.h> //載入 8051 相關暫存器含括檔
sbit SEG_A = P2 ^ 6; // 七段 接腳 測試用接腳
sbit SEG_B = P2 ^ 5;
sbit SEG_C = P2 ^ 4;
sbit SEG_D = P2 ^ 3;
sbit SEG_E = P2 ^ 2;
sbit SEG_F = P2 ^ 1;
sbit SEG_G = P2 ^ 0;
// 定義共陽極與腳位對應關係
sbit SEG_0 = P0 ^ 5; // 個位 開關 測試用接腳
sbit SEG_1 = P0 ^ 6; // 十位 開關 測試用接腳
// 定義七個節段的腳位,將 A, B, C, D, E, F, G 依序放入陣列
byte segs[7] = { SEG_A, SEG_B, SEG_C, SEG_D, SEG_E, SEG_F, SEG_G };
// 定義共陽極七段顯示器的字型(digit pattern)
// define the LED digit patterns, from 0 - 9
// 0 = LED on, 1 = LED off, in this order:
// Mapping to a,b,c,d,e,f,g of Seven-Segment LED
byte seven_seg_digits[10][7] = { { 0,0,0,0,0,0,1 }, // = 0
{ 1,0,0,1,1,1,1 }, // = 1
{ 0,0,1,0,0,1,0 }, // = 2
{ 0,0,0,0,1,1,0 }, // = 3
{ 1,0,0,1,1,0,0 }, // = 4
{ 0,1,0,0,1,0,0 }, // = 5
{ 0,1,0,0,0,0,0 }, // = 6
{ 0,0,0,1,1,1,1 }, // = 7
{ 0,0,0,0,0,0,0 }, // = 8
{ 0,0,0,1,1,0,0 } // = 9
};
// 定義每個七段顯示器顯示的時間 (延遲時間), 預設 1ms
int delay_time = 1;
void setup() {
pinMode(SEG_A, OUTPUT);
pinMode(SEG_B, OUTPUT);
pinMode(SEG_C, OUTPUT);
pinMode(SEG_D, OUTPUT);
pinMode(SEG_E, OUTPUT);
pinMode(SEG_F, OUTPUT);
pinMode(SEG_G, OUTPUT);
pinMode(SEG_0, OUTPUT);
pinMode(SEG_1, OUTPUT);
}
void loop() {
// 從 00 計數到 99
for (unsigned int number = 0; number < 100; number++) {
// 每一秒鐘計數一次
unsigned long startTime = millis();
for (unsigned long elapsed=0; elapsed < 100; elapsed = millis() - startTime) {
// 多工掃瞄,輪流點亮個、十位數的七段顯示器
// 顯示個位數
lightDigit1(number%10);
delay(delay_time);
// 顯示十位數
lightDigit2((number/10)%10);
delay(delay_time);
}
}
}
// 選擇顯示的位數 (2:十、或 1:個位數)
void pickDigit(int x) {
digitalWrite(SEG_0, HIGH);
digitalWrite(SEG_1, HIGH);
switch(x) {
case 1: digitalWrite(SEG_0, LOW); break;
case 2: digitalWrite(SEG_1, LOW); break;
}
}
// 點亮個位數
void lightDigit1(byte number) {
pickDigit(1);
lightSegments(number);
}
// 點亮十位數
void lightDigit2(byte number) {
pickDigit(2);
lightSegments(number);
}
// 點亮七段顯示器
void lightSegments(byte number) {
for (int i = 0; i < 7; i++) {
digitalWrite(segs[i], seven_seg_digits[number][i]);
}
}
Line 16: error: missing ';' before 'segs'
作者:
alphi
時間:
2013-1-18 14:33:30
Hi,看起來你的原先程式碼不是在8051上,8051上基本上不用設定I/O輸出入以及有些函數不是在標準Keil C51上.根據你的問題 我寫一個很簡單的範例,時間沒有正確不過你可以做實驗修改
#include <AT89X51.h> //IC為AT89C51
#include <stdlib.h> //載入 8051 相關暫存器含括檔
//共陽極(接VDD)0~9對應數值
unsigned char seven_seg[10]={ 0xC0, //0
0xF9, //1
0xA4, //2
0xB0, //3
0x99, //4
0x92, //5
0x83, //6
0xF8, //7
0x80, //8
0x98 //9
};
//顯示七段顯示器內容
void disp_7seg(unsigned char num);
//顯示數值
void disp_number(unsigned int num);
//初始化系統
void setup(void);
void delay(unsigned char ms);
int main()
{
unsigned int num=0;
setup();
while(1)
{
//顯示數值
disp_number(num);
delay(255);
if(num<100)
num++;
else
num=0;
}
return 0;
}
//初始化I/O
void setup(void)
{
P0=0x00;
P1=0x00;
P2=0x00;
P3=0x00;
}
//將數值轉換為7段顯示器數值
void disp_7seg(unsigned char num)
{
P2=seven_seg[num];
}
void disp_number(unsigned int num)
{
P3=1; //選擇10位數I/O
disp_7seg((num/10)); //顯示10位數
delay(2);
P3=2; //選擇個數I/O
disp_7seg((num%10)); //顯示個位數
}
//延遲函數
void delay(unsigned char ms)
{
unsigned char i,j;
for(i=0;i<ms;i++)
for(j=0;j<255;j++)
;
}
複製代碼
2013-1-18 14:33:20 上傳
下載附件
(53.69 KB)
附件:
Project.jpg
(2013-1-18 14:33:20, 53.69 KB) / 下載次數 124
https://oursogo.com/forum.php?mod=attachment&aid=NDQzMDA4N3xkZDg0ZTVlNnwxNzUzMDc2MzQyfDB8MA%3D%3D
作者:
grass0423
時間:
2013-1-19 02:23:59
感謝 我先收下 找時間來試看看
作者:
grass0423
時間:
2013-9-2 15:50:31
各位大大!! 我試了alphi大 提供測試的程式
但是卻不能同時二個七段顯示器
數字都只有再 個位數 跳動,拾位數都沒有動
另外的電路是用二個共陽七段顯示器
不知那出問題,請幫我看一下
附件:
七段顯示器-1.jpg
(2013-9-2 15:47:02, 122.95 KB) / 下載次數 16
https://oursogo.com/forum.php?mod=attachment&aid=NjQ5MDYwNXw4MTg2YTUwOHwxNzUzMDc2MzQyfDB8MA%3D%3D
作者:
又靜
時間:
2013-9-2 19:02:37
本帖最後由 又靜 於 2013-9-2 19:05 編輯
我不會C 語言啦
不過稍稍看一下發現:alphi 大俠切換個位數與十位數是用 P3.0 & P3.1
而您是用 P0.5 & P0.6 ,我想....問題會不會出在這裡
另外,掃描停留的時間也是關鍵
太短LED會比較暗甚至看不出有顯示
設得太長LED又會閃爍甚至交換顯示
alphi 也有提到時間沒有很正確.
歡迎光臨 SOGO論壇 (https://oursogo.com/)
Powered by OURSOGO.COM